Android 支持库不兼容
Android support library incompatiblity
我有一个 jcenter 库 ToggleButtons 我开发并导入到我的应用程序中。在我的应用程序中切换到支持 26.1.0 后,我收到此错误:
All com.android.support libraries must use the exact same version
specification (mixing versions can lead to runtime crashes). Found
versions 26.1.0, 25.3.1
切换按钮:
com.android.support:cardview-v7:25.3.1
主应用程序:
com.android.support:design:26.1.0
我正在使用其他库,例如 Glide,它引用甚至更早版本的支持库(我还没有升级到 4),但这些都没有问题。我是否以某种方式不正确地设计了库?
这一直是一个建议,现在他们让它产生错误。
您绝对不能 运行 一个应用同时具有两个版本,因为那样会导致重复的 类 错误。这意味着您现在必须手动选择其中之一,而以前 gradle 会自动为您选择一个。
我建议您使用更大的数字,因为相反的做法可能会丢失库或应用真正依赖的新 features/assets。
对于必须手动解决的每个冲突,您可以在应用程序/库模块的 build.gradle
中的 android 和依赖项块之间添加此内容:
def supportLibraryVersion = '26.0.1'
configurations.all {
resolutionStrategy {
force "com.android.support:cardview-v7:$supportLibraryVersion"
}
}
我猜你已经知道它是如何工作的了。
编辑:
正如 @eugen-pechanec 所指出的,最佳实践是在所有项目模块中使用相同版本的所有支持库。此外,最好在构建工具上使用相同的数字(在模块的 build.gradle 中,在 android 块内)。
以下是您的应用所依赖的内容:
+ design:26.1.0
+ appcompat-v7:26.1.0
+ support-v4:26.1.0
+ recyclerview-v7:26.1.0
+ support-v4:26.1.0
这是库所依赖的:
+ cardview-v7:25.3.1 (i.e. at least 25.3.1)
这是它的意思:
- 卡片视图库对其他支持库没有任何(运行时)依赖性,因此在技术上在这种情况下使用不同的版本是安全的。然而,这可能随时改变。
- 更重要的是,您自己的代码没有将
cardview-v7
定义为依赖项,因此 gradle 无法知道它也应该提取更新版本。
最简单的解决方法就是在 build.gradle:
中定义依赖关系
def supportLibraryVersion = '26.0.1'
compile "com.android.support:cardview-v7:$supportLibraryVersion"
没有force
,没什么特别的。升级依赖项不是问题。
I still don't understand why Glide doesn't throw this error when they're using support 25.
如上所述,Glide 至少使用 support-v4
25.x.x。并且由于您自己的模块已经请求更新版本的 support-v4
,因此依赖项会悄悄升级。
我有一个 jcenter 库 ToggleButtons 我开发并导入到我的应用程序中。在我的应用程序中切换到支持 26.1.0 后,我收到此错误:
All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 26.1.0, 25.3.1
切换按钮:
com.android.support:cardview-v7:25.3.1
主应用程序:
com.android.support:design:26.1.0
我正在使用其他库,例如 Glide,它引用甚至更早版本的支持库(我还没有升级到 4),但这些都没有问题。我是否以某种方式不正确地设计了库?
这一直是一个建议,现在他们让它产生错误。
您绝对不能 运行 一个应用同时具有两个版本,因为那样会导致重复的 类 错误。这意味着您现在必须手动选择其中之一,而以前 gradle 会自动为您选择一个。
我建议您使用更大的数字,因为相反的做法可能会丢失库或应用真正依赖的新 features/assets。
对于必须手动解决的每个冲突,您可以在应用程序/库模块的 build.gradle
中的 android 和依赖项块之间添加此内容:
def supportLibraryVersion = '26.0.1'
configurations.all {
resolutionStrategy {
force "com.android.support:cardview-v7:$supportLibraryVersion"
}
}
我猜你已经知道它是如何工作的了。
编辑: 正如 @eugen-pechanec 所指出的,最佳实践是在所有项目模块中使用相同版本的所有支持库。此外,最好在构建工具上使用相同的数字(在模块的 build.gradle 中,在 android 块内)。
以下是您的应用所依赖的内容:
+ design:26.1.0
+ appcompat-v7:26.1.0
+ support-v4:26.1.0
+ recyclerview-v7:26.1.0
+ support-v4:26.1.0
这是库所依赖的:
+ cardview-v7:25.3.1 (i.e. at least 25.3.1)
这是它的意思:
- 卡片视图库对其他支持库没有任何(运行时)依赖性,因此在技术上在这种情况下使用不同的版本是安全的。然而,这可能随时改变。
- 更重要的是,您自己的代码没有将
cardview-v7
定义为依赖项,因此 gradle 无法知道它也应该提取更新版本。
最简单的解决方法就是在 build.gradle:
中定义依赖关系def supportLibraryVersion = '26.0.1'
compile "com.android.support:cardview-v7:$supportLibraryVersion"
没有force
,没什么特别的。升级依赖项不是问题。
I still don't understand why Glide doesn't throw this error when they're using support 25.
如上所述,Glide 至少使用 support-v4
25.x.x。并且由于您自己的模块已经请求更新版本的 support-v4
,因此依赖项会悄悄升级。