我们正在维护一个Android库。最近我们升级了gradle,compileSdkVersion和支持库版本。 (仅使用com.android.support:design)。我们还升级了gcm-play-services该库发布到Artifactory,其依赖项也在pom文件中。此升级适用于具有最新构建工具和支持库的项目。但是,我们正面临使用我们的库的过时项目的问题。这是库的版本。
gradle android plugin -> 3.2.1
compileSdkVersion -> 28
targetSdkVersion -> 28
support library version -> 28.0.0
这是项目的版本
compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1
和客户端支持库依赖项
implementation 'com.android.support:cardview-v7:' + androidSupportV
implementation 'com.android.support:recyclerview-v7:' + androidSupportV
implementation 'com.android.support:appcompat-v7:' + androidSupportV
implementation 'com.android.support:design:' + androidSupportV
implementation 'com.android.support:support-v4:' + androidSupportV
implementation 'com.android.support:support-annotations:28.0.0'
尝试使用新库构建项目后,使用此日志构建失败。
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values-v28/values-v28.xml","position":{"startLine":8,"startColumn":4,"startOffset":447,"endLine":11,"endColumn":12,"endOffset":684}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/dialogCornerRadius not found.","sources":[{"file":"/Users/umutyusuf/Documents/repo/core-bootstrap/core-android-client-app/PointrSample-Ozion-v5.0.8/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml","position":{"startLine":10}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/fontVariationSettings not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
AGPBI: {"kind":"error","text":"error: resource android:attr/ttcIndex not found.","sources":[{"file":"/Users/umutyusuf/.gradle/caches/transforms-1/files-1.1/appcompat-v7-28.0.0.aar/d4439e502685c256006fa4bec8edb713/res/values/values.xml","position":{"startLine":1303,"startColumn":4,"startOffset":70911,"endColumn":68,"endOffset":70975}}],"original":"","tool":"AAPT"}
我们避免在项目代码中进行任何操作,因此试图在库中解决它。
我们降级所有版本以匹配项目版本。并再次发布它
compileSdkVersion -> 26
targetSdkVersion 26
support library version -> 26.0.1
但在那之后,我们面临一个明显的合并错误
Error:
Attribute meta-data#android.support.VERSION@value value=(26.0.1) from [com.android.support:cardview-v7:26.0.1] AndroidManifest.xml:25:13-35
is also present at [com.android.support:support-v4:26.1.0] AndroidManifest.xml:28:13-35 value=(26.1.0).
Suggestion: add 'tools:replace="android:value"' to <meta-data> element at AndroidManifest.xml:23:9-25:38 to override
这源于gcm-play-services,它在依赖树中列出了support-v4:26.1.0传递依赖性。
并解决它,将此添加到清单
<meta-data
tools:node="replace"
tools:replace="android:value"
android:name="android.support.VERSION"
android:value="26.0.1" />
这使一切顺利。但是现在将这个元标记放到AndroidManifest文件中的缺点是什么?
我们使用所有compileSdkVersion 26,27,28和所有相应的支持库版本测试了这种方法。一切似乎都有效。
我们正在寻找更好的方法。
我们试过的替代方案
我们在提供的范围内发布了支持库依赖项。但在这种情况下,使用库的项目应该添加他们的支持设计库,以便能够使用没有问题。但即使他们添加了支持库,如果项目有不同的支持库版本,那么它会成为一个问题吗?
如果您的客户端使用支持库在其清单中以相同方式强制使用另一版本的android.support,则此清单元数据可能会导致问题。因此,请避免在SDK中使用此行。如果您的客户端没有像您所说的那样提供支持库,那么使用“提供”范围发布也不会起作用并导致崩溃。
我找到的解决方案是使用支持:设计:27.1.0。这是一个不与任何其他版本的支持库冲突的神奇库。经过几天的尝试后,我很高兴看到它解决了这个问题,并且如果第三方使用其他版本的支持设计,则不会导致崩溃。希望它也能解决你的问题。