使用不同版本的 Android 支持库的解决方法

Posted

技术标签:

【中文标题】使用不同版本的 Android 支持库的解决方法【英文标题】:Workaround for Using Different Versions of Android Support Libraries 【发布时间】:2018-02-28 13:54:34 【问题描述】:

这是参考出现在 build.gradle 文件中的警告消息:

所有 com.android.support 库必须使用完全相同的版本 规范(混合版本可能导致运行时崩溃)

我很清楚这一点,并在我自己的代码/构建中使用相同的版本。但是,当涉及到我使用的一些 3rd 方库 时,情况并非如此。

有时第 3 方库使用旧版本,而其他一些库使用新版本 - 因此更新您的支持库版本不会解决问题。

在某些情况下,您可能不想升级正在使用的支持库的版本。

使用不同版本的支持库重新编译 3rd 方库也不是一种选择,因为在我的情况下代码不可用。

当其他引用的第 3 方库使用不同版本的支持库时,解决此问题的解决方法或推荐方法是什么?

【问题讨论】:

【参考方案1】:

您可以排除所有传递依赖项,也可以一一排除,然后将所需版本包含在您的 build.gradle 文件中。

方法一——排除一个库的所有依赖

使用 transitive 字段告诉 gradle 您不希望解析 transitive 依赖项。 transitive 的文档说:

设置是否应解析此依赖项,包括或排除其传递依赖项。属于此依赖项的工件本身可能依赖于其他工件。后者称为传递依赖。

示例:

compile('com.super.lib:awesome@aar') 
    transitive = false


方法 2 - 选择您不想包含的依赖项

使用exclude 方法:

添加排除规则以排除此依赖项的传递依赖项。

示例:

compile('com.super.lib:awesome@aar') 
    exclude group: 'com.dont.want.this', module: 'old-artifact'

但是请注意,这并不能保证排除的依赖项不会被另一个依赖项拉入。如果您想从任何地方排除依赖项,请使用配置范围的排除策略:

configurations.all 
    exclude group: 'com.dont.want.this', module: 'old-artifact'

另外,您需要同时指定groupmodule 名称。这个例子来自gradle的JavaDoc:

dependencies 
     compile('org.hibernate:hibernate:3.1') 
         //excluding a particular transitive dependency:
         exclude module: 'cglib' //by artifact name
         exclude group: 'org.jmock' //by group
         exclude group: 'org.unwanted', module: 'iAmBuggy' //by both name and group
     


警告

只是一个关于更改依赖版本号的危险的友好提醒。

当您使用此技术更改依赖项版本时,您必须彻底测试应用程序,因为在新/旧版本的依赖项中可能会出现重大更改或意外行为。很明显,major 版本号跳转可能会导致崩溃/意外行为,但你必须注意版本号的 patch 部分,因为 lib 创建者可能已经预料到所使用的依赖版本有一些错误,并且包含一些修复,一旦错误被修复,可能会破坏 lib。

【讨论】:

以上是关于使用不同版本的 Android 支持库的解决方法的主要内容,如果未能解决你的问题,请参考以下文章

sql脱库的几种方法

libcurl库编译生成不带版本的设置方法

Android Studio Gradle 版本不同报错解决方法

Android多个Module统一配置相同jar或库的版本号

jQuery多库共存问题解决方法

使用带有最新支持库的 admob 15.0.0 时发生 Gradle 冲突