【问题标题】:Android support library incompatiblityAndroid 支持库不兼容
【发布时间】:2023-04-06 00:13:01
【问题描述】:

我有一个 jcenter 库 ToggleButtons 我开发并导入到我的应用程序中。在我的应用中切换到支持 26.1.0 后,我收到此错误:

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

切换按钮:

com.android.support:cardview-v7:25.3.1

主应用:

com.android.support:design:26.1.0

我正在使用其他库,例如 Glide,这些库甚至引用了支持库的早期版本(我还没有升级到 4),但这些都没有问题。我是否以某种方式错误地设计了库?

【问题讨论】:

  • 你能发布你的 gradle、gradle plugin for android 和 android studio 版本以供将来参考吗?
  • 使用compile 'com.android.support:design:25.3.1'而不是26.1.0
  • 这不是一个理想的解决方案。在这种情况下,我实际上是在使用 26 中的新功能。

标签: android android-gradle-plugin android-support-library android-library


【解决方案1】:

这一直是一个建议,现在他们让它产生错误。

您绝对不能同时运行两个版本的应用,因为这会导致重复类错误。这意味着您现在必须手动选择其中之一,而之前的 gradle 会自动为您选择一个。

我建议您使用较大的数字,因为相反的做法可能会丢失库或应用真正依赖的新功能/资产。

对于您必须手动解决的每个冲突,您可以在应用程序/库模块的 build.gradle 中的 android 和依赖项块之间添加此代码:

def supportLibraryVersion = '26.0.1'


configurations.all {
    resolutionStrategy {
        force "com.android.support:cardview-v7:$supportLibraryVersion"
    }
}

我想你知道它是如何工作的。

编辑: 正如@eugen-pechanec 所指出的,最佳实践是在所有项目模块中让所有支持库具有相同的版本。此外,最好在构建工具上使用相同的数字(在模块的 build.gradle 中,在 android 块内)。

【讨论】:

  • 除此之外只会强制 cardview-v7 库为特定版本。您将使用不同版本的不同支持库,这绝对不是您想要的。阅读此stackoverflow.com/questions/42949974/…
  • 确切地说,这意味着对于每个剩余的冲突,您都会在其中添加一个额外的行来解决它。对所有支持库依赖项应用相同的版本也是一个好习惯。
  • 我导入了库的源代码并更新到 26,这确实解决了问题。
  • @EugenPechanec 我之前尝试过您的解决方案并遇到错误,但那是因为我将它放在项目级 build.gradle 中。感觉就像会去那里的东西。也许你们都可以用粗体标出?我还是不明白为什么 Glide 在使用 support 25._._ 时不会抛出这个错误。_._
  • @Anthony,我又看了你的问题,也许找到了更合适的答案。法比奥,你也看看,可能有用
【解决方案2】:

这是您的应用所依赖的:

+ 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,没什么特别的。升级依赖项不是问题。 Only downgrading is.

我还是不明白为什么 Glide 在使用 support 25 时不会抛出这个错误。

如上所述,Glide 使用至少support-v425.x.x。而且由于您自己的模块已经请求了更新版本的support-v4,因此依赖项会静默升级。

【讨论】:

  • 那么 Glide 团队究竟做了什么来定义“至少”25.x.x?在我使用的版本(3.7)中,他们仍在使用“编译”,我在他们的构建文件中没有看到任何其他特殊内容。
  • 它们使用的语法与您在 build.gradle 中使用的语法完全相同。 gradle 中的默认行为是“选择所有已定义的最新版本”。如果你定义了 support-v4:25.3.1 和一个你使用 26.1.0 的库,gradle 会选择 26.1.0。您项目中的 support-v4 的最新版本是 26.1.0,因此被选中。你项目中cardview-v7的最新版本是25.3.1,所以选择了它。 (其实和 build.gradle 无关。依赖是由库工件分发的 pom.xml 文件定义的。但这并不重要。)
  • 我忘记了 cardview 是一个扩展,而不是基本支持库的一部分。现在你的答案很有意义。因此,由于 ToggleButtons 从未从 CardView 公开任何内容,新的“实现”或“提供”配置会消除此问题,因为 cardview 永远不会传递吗? (我还没有找到关于“提供”的太多信息,它似乎与实现很相似)
  • providedcompileOnly 的旧名称。如果库定义了compileOnly cardview-v7,您的项目不会提取传递依赖,但您仍然必须提供库,否则您的应用程序会在运行时崩溃(CardView 不会在应用程序中编译)。 /// 如果库定义了implementation cardview-v7,您的项目将提取依赖项,但您不会在 IDE 中使用 CardView 获得完成提示(很好)。但是问题仍然存在:您仍然会使用不同版本的不同支持库(并且在编译时会遇到相同的错误)。
  • 使用 implementation "com.android.support:cardview-v7:25.3.1" 在本地构建库我不再遇到构建问题。构建配置显然不是我的强项,但根据文档,这是有道理的,因为 cardview 永远不应该进入应用程序类路径,如果我理解正确,它就会被有效地沙盒化。这不是决定性的,因为我的 Kotlin 也与 26 不兼容,所以我必须退回一些 Kotlin 代码来部署以确认。
猜你喜欢
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多