这是参考build.gradle文件中出现的警告消息:
All com.android.support libraries must use the exact same version
specification (mixing versions may lead to runtime crashes)
我很清楚这一点,并在我自己的代码/构建中使用相同的版本.但是,对于我使用的某些第三方库,情况并非如此.
有时第三方库使用旧版本,而其他一些库使用较新版本 – 因此更新支持库版本将无法解决问题.
在某些情况下,您可能不希望升级正在使用的支持库的升级版本.
使用不同版本的支持库重新编译第三方库也不是一种选择,因为在我的情况下代码不可用.
当其他引用的第三方库使用不同版本的支持库时,解决此问题的解决方法或建议方法是什么?
解决方法:
您可以排除所有传递依赖项或逐个排除,然后在build.gradle文件中包含所需的版本.
方法1 – 排除lib的所有依赖项
使用传递字段告诉gradle您不希望解析传递依赖关系.传递文件说:
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'
}
此外,您不需要同时指定组名称和模块名称.这个例子来自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创建者可能已经预期所使用的依赖版本有一些错误和包含一些修复程序,一旦修复了bug,可能会破坏lib.