Android支持库不兼容

Android支持库不兼容,android,android-gradle-plugin,android-support-library,android-library,Android,Android Gradle Plugin,Android Support Library,Android Library,我开发了一个jcenter库,可以导入到我的应用程序中。在我的应用程序中切换到支持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,它甚至引用了支持库的早期版本(我

我开发了一个jcenter库,可以导入到我的应用程序中。在我的应用程序中切换到支持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会自动为您选择一个

我建议你使用更高的数字,因为做相反的事情可能会丢失库或应用程序真正依赖的新功能/资产

对于必须手动解决的每个冲突,您可以在应用程序/库模块的
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)
以下是库所依赖的内容:

+ 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)
这就是它的意思:

  • Card view库对其他支持库没有任何(运行时)依赖性,因此从技术上讲,在这种情况下,使用不同的版本是安全的。但是,这可能随时发生变化
  • 更重要的是,您自己的代码没有将
    cardwiew-v7
    定义为依赖项,因此gradle无法知道它也应该获取更新版本
  • 最简单的修复方法就是在build.gradle中定义依赖项:

    def supportLibraryVersion = '26.0.1'
    compile "com.android.support:cardview-v7:$supportLibraryVersion"
    
    没有强制,没有什么特别的。升级依赖项不是问题

    我仍然不明白为什么Glide在使用support 25时没有抛出这个错误


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

    您可以发布gradle、gradle android插件和android studio版本以供将来参考吗?使用
    编译'com.android.support:design:25.3.1'
    而不是26.1.0这不是一个理想的解决方案。在本例中,我实际使用的是26中的新功能。但这只会强制cardview-v7库使用特定版本。您将使用不同版本的支持库,这绝对不是您想要的。请仔细阅读,这意味着对于每一个剩余的冲突,您都要在其中添加一行来解决它。此外,将同一版本应用于所有支持库依赖项也是一种良好的做法。我导入了库的源代码,并将其更新为26,这确实解决了问题。@EugenPechanec我之前尝试过您的解决方案,但出现了一个错误,但这是因为我将其放在了项目级别的build.gradle中。感觉像是要去那里的东西。也许你们两个都可以用粗体写出来?我仍然不明白为什么Glide在使用support 25时没有抛出这个错误。\u@Anthony,我又看了一眼你的问题,也许找到了一个更合适的答案。法比奥,再看一看,这可能是有用的,那么Glide团队到底做了什么来定义“至少”25.x.x?在我使用的版本(3.7)中,他们仍然使用“compile”,我在他们的构建文件中没有看到任何其他特殊之处。他们使用与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永远不会是可传递的?(我还找不到关于'provided'的更多信息,它似乎与实现类似)
    provided
    compileOnly
    的旧名称。如果库已定义
    compileOnly cardview-v7
    您的项目将不会提取可传递依赖项,但您仍必须提供库,否则您的应用程序将在运行时崩溃(cardview不会在应用程序中编译)。///如果库定义了
    implementation cardwiew-v7
    ,那么您的项目将提取依赖项,但您不会在IDE中使用cardwiew获得完成提示(很好)。但问题仍然存在:您仍然在使用不同版本的支持库(编译时会出现相同的错误)。通过使用
    实现“com.android.support:cardwiew-v7:25.3.1”
    本地构建库,我不再有构建问题。构建配置显然不是我的强项,但根据文档,这是有意义的,因为cardview永远不会进入应用程序类路径,如果我理解正确,它实际上是沙盒。这不是决定性的,因为我还有一个Kotlin与26不兼容的问题,所以我必须退回一些Kotlin代码进行部署,以确定是否正确。