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

Workaround for Using Different Versions of Android Support Libraries

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

All com.android.support libraries must use the exact same version specification (mixing versions may lead to runtime crashes)

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

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

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

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

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

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

方法 1 - 排除库的所有依赖项

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

Sets whether this dependency should be resolved including or excluding its transitive dependencies. The artifacts belonging to this dependency might themselves have dependencies on other artifacts. The latter are called transitive dependencies.

示例:

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

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

使用exclude方法:

Adds an exclude rule to exclude transitive dependencies of this dependency.

示例:

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。