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

时间:2017-09-19 17:11:29

标签: android android-support-library versions multiple-versions

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

  

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

我很清楚这一点,并在我自己的代码/构建中使用相同的版本。但是,对于我使用的某些第三方库,情况并非如此。

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

方法1 - 排除lib的所有依赖关系

使用transitive字段告诉gradle您不希望解析传递依赖项。 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
     }
}

警告

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

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