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

时间:2019-03-08 15:30:57

标签: android-gradle google-play-services android-support-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" />

这使所有工作正常。 但是现在将这个meta标签放入AndroidManifest文件的弊端是什么?

我们用所有compileSdkVersion 26、27、28测试了这种方法 以及所有相应的支持库版本。一切似乎都可以。

我们正在寻找更好的方法。

我们尝试过的替代解决方案

我们在提供的范围内发布了支持库依赖项。但是在这种情况下,使用库的项目应添加其支持设计库,以便能够毫无问题地使用。 但是,即使他们添加了支持库,但是如果项目使用的支持库版本不同,那么编译哪个库会不会有问题呢?

1 个答案:

答案 0 :(得分:1)

如果您的客户端使用的支持库会以相同的方式强制使用另一个版本的android.support,则此清单元数据可能会导致问题。因此,请避免在SDK中使用此行。如果您的客户不提供您所说的支持库,则使用“提供”范围的发布也将不起作用,并且会导致崩溃。

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