使用不同版本的 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'
另外,您需要同时指定group
和module
名称。这个例子来自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 支持库的解决方法的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio Gradle 版本不同报错解决方法