升级库版本导致依赖库的项目构建失败

Upgrading Library Versions Causes Build Failure in project that depends the library

我们正在维护一个 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 中使用这一行。如果您的客户没有像您所说的那样提供支持库,则使用范围 'provided' 发布也将不起作用并导致崩溃。

我找到的解决方案是使用 support:design:27.1.0 。这是一个神奇的库,不会与任何其他版本的支持库冲突。经过几天的尝试,我很高兴看到它解决了这个问题,并且如果第三方使用其他版本的支持设计也不会导致崩溃。希望它也能解决您的问题。