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)

这是它的意思:

  1. 卡片视图库对其他支持库没有任何(运行时)依赖性,因此在技术上在这种情况下使用不同的版本是安全的。然而,这可能随时改变。
  2. 更重要的是,您自己的代码没有将 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,因此依赖项会悄悄升级。