所有的com.android.support库必须使用完全相同的版本规范。

806

更新到Android Studio 2.3后,我收到了这个错误消息。我知道它只是一个提示,因为应用程序仍然正常运行,但这真的很奇怪。

所有com.android.support库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃)。发现版本号为25.1.1、24.0.0等。例如,com.android.support:animated-vector-drawable:25.1.1和com.android.support:mediarouter-v7:24.0.0

输入图像描述

我的Gradle:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    testCompile 'junit:junit:4.12'

    compile 'com.android.support:appcompat-v7:25.1.1'
    compile 'com.android.support:support-v4:25.1.1'
    compile 'com.android.support:design:25.1.1'
    compile 'com.android.support:recyclerview-v7:25.1.1'
    compile 'com.android.support:cardview-v7:25.1.1'
    compile 'com.google.android.gms:play-services-maps:10.2.0'
    compile 'com.google.android.gms:play-services:10.2.0'

    compile 'io.reactivex.rxjava2:rxjava:2.0.1'
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'com.jakewharton:butterknife:8.4.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    compile 'com.blankj:utilcode:1.3.6'
    compile 'com.orhanobut:logger:1.15'
    compile 'com.facebook.stetho:stetho:1.4.2'

    provided 'com.google.auto.value:auto-value:1.2'
    annotationProcessor 'com.google.auto.value:auto-value:1.2'
    annotationProcessor 'com.ryanharter.auto.value:auto-value-parcel:0.2.5'

    compile 'com.mikepenz:iconics-core:2.8.2@aar'
    compile('com.mikepenz:materialdrawer:5.8.1@aar') { transitive = true }
    compile 'com.mikepenz:google-material-typeface:2.2.0.3.original@aar'
    compile 'me.zhanghai.android.materialprogressbar:library:1.3.0'
    compile 'com.github.GrenderG:Toasty:1.1.1'
    compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.8.0'
    compile 'com.github.MAXDeliveryNG:slideview:1.0.0'

    compile 'com.facebook.fresco:fresco:1.0.1'
    compile 'com.github.bumptech.glide:glide:3.7.0'

    compile 'com.google.maps.android:android-maps-utils:0.4.4'
    compile 'com.github.jd-alexander:library:1.1.0'
}

将以下代码添加到你的项目Build.Gradle中:subprojects { project.configurations.all { resolutionStrategy.eachDependency { details -> if (details.requested.group == 'com.android.support' && !details.requested.name.contains('multidex') ) { details.useVersion "26.+" } } } } - Sunil Chaudhary
54个回答

913

您可以通过以下解决方案之一解决此问题:

更新:

自Android Studio 3.0以来,它变得更加容易,因为它现在显示了更有用的提示,所以我们只需要按照这个提示即可。
例如: 11

所有com.android.support库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃)。找到的版本为27.0.2、26.1.0。示例包括com.android.support: animated-vector-drawable:27.0.2和com.android.support: customtabs:26.1.0

某些库、工具和库的组合是不兼容的或可能导致错误。其中一种不兼容性是使用不是最新版本的Android支持库进行编译(或者特别是低于目标SDK版本的版本)。

解决方案:
显式添加旧版本的库,但使用新版本号。
在我的情况下,com.android.support:customtabs:26.1.0,因此我需要添加:

(Kotlin构建脚本)

implementation("com.android.support:customtabs:27.0.2")

(Groovy构建脚本)

implementation "com.android.support:customtabs:27.0.2"  

即:从第二个项目中获取库,并使用第一个项目中的版本号进行实现。

注意:不要忘记立即同步,以便Gradle重新构建依赖关系图并查看是否有更多冲突。

解释:
您可能会因为错误消息而感到困惑,因为您没有使用customtabs,所以我怎么会有冲突!!
好吧..虽然您没有直接使用它,但是您的某个库在内部使用了customtabs的旧版本,因此您需要直接请求它。

如果您想知道哪个库负责旧版本,并且可能要求作者更新他的库,请运行Gradle依赖项报告,参见旧回答以了解如何操作。

请注意这点。


更新:

从gradle插件版本3.0开始,compile已被替换为implementationapi,请参考this answer了解区别。

因此,请在mac、Linux和PowerShell中使用以下命令代替:

./gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

或者对于Windows命令提示符:

gradlew -q dependencies app:dependencies --configuration debugAndroidTestCompileClasspath

并搜索冲突版本。

对我来说,在删除com.google.android.gms:play-services:10.2.0后,错误消失了。

只包括com.google.android.gms:play-services-location:10.2.0com.google.android.gms:play-services-maps:10.2.0,因为它们是我使用的仅有的两个Play服务。

我认为gms:play-services依赖于一些旧版本的支持库组件,因此我们需要显式地添加它们。


适用于 AS 3.0 及更早版本。

运行:

./gradlew -q dependencies <module-name>:dependencies --configuration implementation

例子:

./gradlew -q dependencies app:dependencies --configuration implementation

旧答案:

CommonsWare的回答启发:

运行Gradle依赖报告以查看您的完整依赖树。

从那里,您将看到您的哪个库正在请求不同版本的Android支持库。 无论它要求什么,您都可以直接使用25.2.0版本请求它,或者使用Gradle的其他冲突解决方法来获取相同的版本。


如果有人知道在新的Gradle插件中有更好的方法,请告诉我。


3
com.google.android.gms:play-services:10.2.0 支持SDK 14及以上版本,如果您想使用低于SDK 14的版本,则需要使用版本号为 10.0.1 的库,参考https://dev59.com/OZ_ha4cB1Zd3GeqPwEZa#42315590。 - Sneh Pandya
2
@humazed,这是一个新手问题,我应该在Android Studio中的哪里运行命令? - Haikal Nashuha
1
在终端中,但首先尝试尝试 play-services 东西。 - humazed
1
我是唯一一个认为这很疯狂的人吗?我只想要Admob和Facebook,但它们拒绝合作... - Jay
3
提示一下,错误信息中的 examples include 文本显示的是来自您自己项目的实际示例,而不是模糊的问题类型示例。取出第二项中的库,并使用第一项的版本号进行实现。 - Benjamin Kershner
显示剩余21条评论

202
  1. 前往你的文件系统中的 project/.idea/libraries 文件夹,查看哪些库不同。
  2. 你需要在 build.gradle 文件中手动包含这些相同版本的库。
  3. 然后,同步你的项目。

例如:

compile 'com.android.support:appcompat-v7:25.2.0'

// Wrong library version found on 1st point
compile 'com.android.support:customtabs:25.2.0'

好主意。我从没想过去看哪一个实际上是错误的。:S 谢谢! - Tobias Reich
当Gradle自动解析方法无法工作时,此方法有效,谢谢。 - Odaym
10
在/项目文件/我的项目/.idea/libraries中,有多个不同版本的支持文件。现在我该如何知道哪个模块或依赖正在使用它呢? - Satpal Yadav
2
@SatpalYadav 我搜索了不与最新版本匹配的版本(我在我的应用程序中使用)。例如,我使用support:design:25.3.1,但material-dialogs使用support-v13:25.1.1。因此,我添加了support-v13:25.3.1,错误消失了。 - hardysim
1
这是目前对我来说最好的解决方案,但我如何覆盖更新的库? - Mateusz Kaflowski
显示剩余4条评论

150

适用于所有情况,不仅限于这些版本或库:

请注意小信息窗口所说的关于错误的内容,它指出了您需要更改和添加的示例

在这种情况下:

找到的版本为25.1.1、24.0.0。示例包括:com.android.support:animated-vector-drawable:25.1.1 和 com.android.support:mediarouter-v7:24.0.0

您的

com.android.support:animated-vector-drawable:25.1.1

是版本 25.1.1,而您的

com.android.support:mediarouter-v7:24.0.0

是版本 24.0.0,因此您需要添加相同版本的 mediarouter:

com.android.support:mediarouter-v7:25.1.1

对于每一个小信息窗口所说的例子,都要这样做,在这个例子中是所有没有版本为25.1.1的库。

在你修复指定的库后,你需要同步gradle以查看下一个需要更改的库和包。

重要提示:如果你没有明确使用一个或多个指定的库而它仍然报错,那么这意味着另一个库在内部使用了它,请将它显式编译。

你也可以使用另一种方法来查看你实际编译的所有库的版本差异(比如运行gradle依赖项报告或者查看你的库文件),真正的目标是将所有正在使用的库编译为相同的版本


1
非常感谢,您能否解释一下 support:mediarouter 到底是做什么的? - mrid
1
我认为这是你指出的大多数人都忽略了的事情。例如-“注意一下那个关于错误的小信息窗口……”。谢谢,现在我更好地理解了实际发生的情况。 - Yo Apps

109

解决问题的最佳方法是按照Android Studio建议实现所有'com.android.support:...'。

(无论您使用哪个支持版本-27.1.1、28.0.0等)

将光标放置在错误行上,例如:

implementation 'com.android.support:appcompat-v7:28.0.0'

Android Studio会提示您哪些'com.android.support:...'与'com.android.support:appcompat-v7:28.0.0'不同版本。

例如,所有com.android.support库必须使用完全相同的版本说明(混合版本可能导致运行时崩溃)。发现版本为28.0.0、27.1.0、27.0.2。示例包括com.android.support:animated-vector-drawable:28.0.0和com.android.support:exifinterface:27.1.0

因此,添加com.android.support:animated-vector-drawable:28.0.0com.android.support:exifinterface:28.0.0。现在同步gradle文件。逐个尝试实现所有建议的'com.android.support:...',直到这行implementation 'com.android.support:appcompat-v7:28.0.0'没有错误。

在我的情况下,我添加了

implementation 'com.android.support:appcompat-v7:28.0.0'

implementation 'com.android.support:animated-vector-drawable:28.0.0'
implementation 'com.android.support:exifinterface:28.0.0'
implementation 'com.android.support:cardview-v7:28.0.0'
implementation 'com.android.support:customtabs:28.0.0'
implementation 'com.android.support:support-media-compat:28.0.0'
implementation 'com.android.support:support-v4:28.0.0'

所有这些依赖项,可能因为你而不同。


我手动添加了 "implementation 'com.android.support:animated-vector-drawable:28.0.0' " 和 " implementation 'com.android.support:support-media-compat:28.0.0' ",但是 "implementation 'com.android.support:appcompat-v7:28.0.0' " 仍然被红色下划线标记。 - AAEM
如果您将光标放在错误行上,@AAEM会显示接下来应该添加哪些依赖项。请将所有的依赖项添加到同一个版本,并同步Gradle文件。如果再次显示错误,请再次按照步骤操作,直到没有错误为止。 - Adarsh Vijayan P

102

将以下代码添加到build.gradle(Module:app)文件的结尾处:

configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
    def requested = details.requested
    if (requested.group == 'com.android.support') {
        if (!requested.name.startsWith("multidex")) {
            details.useVersion '25.3.1'
        }
     }

   }
}

确保您将'25.3.1'替换为要用于所有依赖项的Android支持库版本,它不应低于您的编译SDK版本

然后重新同步Gradle


3
这正是我需要的,我的一个依赖项在某种情况下拉取了27.0.1版本,即使我在顶层指定了较低的版本。出于好奇,为什么您要排除“multidex”? - ray
4
这帮了我一个大忙。但是随着时间的推移,这个安卓开发变得越来越分散。在发布之前,人们需要仔细检查每个支持库。我们没有总是有足够的时间去浏览每个新的支持版本,因为我们想专注于构建我们的产品而不是处理所有这些繁琐事务。这总是令人沮丧的。 - Akah
非常感谢您的解决方案,这涉及到Groovy技术和语法,但在Android Studio - Gradle文件中,当我们编写类似于此的内容时,无法显示任何建议(使用Ctrl + Space)。您知道有什么插件/工具可以在Gradle文件中编写Groovy代码时显示建议,而不是复制/粘贴一些我们不记得或不理解的代码吗? - Phong Nguyen
1
@ThinkTwiceCodeOnce 你可以点击这里了解更多关于Groovy及其IntelliJ插件的信息:https://www.jetbrains.com/help/idea/getting-started-with-groovy.html - ezzou
这对我解决了很多问题!非常感谢。其他需要修改第三方依赖项的解决方案不是一个选项。 - merger
显示剩余2条评论

54

在更新到Android Studio 2.3后,我遇到了完全相同的问题。

将以下这行代码添加到依赖项中解决了我的问题:

compile 'com.android.support:customtabs:25.2.0'

2
我在升级到Android Studio 2.3后遇到了完全相同的问题。 - Plugie
1
对于使用RenderScript的任何人,我将renderscriptSupportModeEnabled设置为false。并添加了编译'com.android.support:customtabs:25.2.0',错误消失了。 - Lawrence Gimenez
1
@LawGimenez 如果我们刚刚禁用了renderscript,那么我们应该如何使用它呢? - dor506
3
看起来我的问题也是由于RenderScript引起的,但如果我需要使用RenderScript做其他事情而不是用于CustomTabs时该怎么办? - HendraWD

46

A) 运行gradle dependencies 或者 ./gradlew dependencies

B) 查看依赖树,找出指定了不同的支持库版本来控制你无法控制的一个依赖项。

我没有意识到这个警告也会显示如果该依赖项直接未被你自己的代码使用。在我的情况下,Facebook 指定了一些我没有使用的支持库,你可以在下面看到大部分这些依赖项都已被我自己的 25.2.0 指定覆盖了,用-> X.X.X (*)符号表示。卡片视图和自定义选项卡库没有被任何人覆盖,所以我需要自己请求 25.2.0 版本的这些库,尽管我不使用它们。

+--- com.facebook.android:facebook-android-sdk:4.17.0
|    +--- com.android.support:support-v4:25.0.0 -> 25.2.0 (*)
|    +--- com.android.support:appcompat-v7:25.0.0 -> 25.2.0 (*)
|    +--- com.android.support:cardview-v7:25.0.0
|    |    \--- com.android.support:support-annotations:25.0.0 -> 25.2.0
|    +--- com.android.support:customtabs:25.0.0
|    |    +--- com.android.support:support-compat:25.0.0 -> 25.2.0 (*)
|    |    \--- com.android.support:support-annotations:25.0.0 -> 25.2.0
|    \--- com.parse.bolts:bolts-android:1.4.0 (*)
如果Gradle已经警告您并给出了示例...

示例包括 com.android.support:animated-vector-drawable:25.1.1 和 com.android.support:mediarouter-v7:24.0.0

如果您在较低版本中加入一些grep高亮显示,那么将更容易,因为gradle dependencies可能会很冗长。
./gradlew dependencies | grep --color -E 'com.android.support:mediarouter-v7|$'

1
从您的解释中,我理解 X.X.X -> Y.Y.Y (*) 的意思是 X.X.X 被 Y.Y.Y 覆盖,这很好知道。 - Mercury
唯一有效的答案。 - stef

32

使用变量:像以下这样做将使您更容易确保在所有库中使用相同版本

dependencies {

    ext {
        support_library_version = '25.2.0'
        google_play_services_version = '10.2.0'
    }

    //#####################################################################
    //          Support Library
    //#####################################################################
    compile "com.android.support:appcompat-v7:${support_library_version}"
    compile "com.android.support:palette-v7:${support_library_version}"
    compile "com.android.support:design:${support_library_version}"

    //#####################################################################
    //          Google Play Services
    //#####################################################################
    compile "com.google.android.gms:play-services-auth:${google_play_services_version}"
    compile "com.google.android.gms:play-services-ads:${google_play_services_version}"
    compile "com.google.android.gms:play-services-analytics:${google_play_services_version}"

    //#####################################################################
    //          Firebase
    //#####################################################################
    compile "com.google.firebase:firebase-core:${google_play_services_version}"
    compile "com.google.firebase:firebase-auth:${google_play_services_version}"
    compile "com.google.firebase:firebase-messaging:${google_play_services_version}"

您可以在此文章中找到更多有关Google建议如何处理版本控制的信息。


亲爱的Daniel F,我认为这是避免版本混合问题的最佳方法。谢谢。 - Hovanes Mosoyan
2
请注意:如上链接所建议,我们应该在顶层的GRADLE文件中定义这种类型的变量。再次感谢。 - Hovanes Mosoyan

25

只需添加以下内容:

compile 'com.android.support:mediarouter-v7:25.2.0'

已更新以适应新的SDK版本

compile 'com.android.support:mediarouter-v7:28.0.0-alpha3'

旧库包含旧的SDK并不能解决问题。 - CoolMind

19

如你所见,以上所有答案和评论内容已经讲清楚了,但这个回答是为了澄清新开发者可能不易理解的一些内容。

./gradlew -q dependencies app:dependencies --configuration compile

上述命令绝对会救你于水深火热之中,但如何从其结果中找到我们需要的信息呢?

当你获得以上命令产生的所有依赖关系图或列表后,你需要查找在代码中引起冲突的版本号。请参见以下图片。

enter image description here

在上图中,您可以看到23.4.0正在导致问题,但我们无法在gradle文件中找到这个版本号。现在这个版本号(23.4.0)将拯救我们。当我们有了这个数字之后,我们就可以在上述命令的结果中查找该数字,并直接在我们的gradle文件中导入该依赖项。请参见以下图片以获取清晰的视图。

你可以清楚地看到,com.android.support:cardview-v7:23.4.0com.android.support:customtabs:23.4.0正在使用导致问题的版本。现在只需从依赖列表中复制这些行,并在我们的gradle文件中显式使用更新的版本链接即可。

implementation "com.android.support:cardview-v7:26.1.0" implementation "com.android.support:customtabs:26.1.0"


1
谢谢!随着较新版本的Android Studio,应该将其从“compile”切换到“implementation”。 - A P
是的,@AviParshan,你说得对,我们可以使用编译或API。在API配置中出现的依赖项将被传递地暴露给库的消费者,并因此出现在消费者的编译类路径上。另一方面,在实现配置中找到的依赖项不会被暴露给消费者,因此不会泄漏到消费者的编译类路径中。 - anoop ghildiyal
使用 ./gradlew -q dependencies app:dependencies --configuration implementation 命令查看依赖项。 - Sumit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接