如何解决 "All com.android.support libraries must use the exact same version specification" 问题?

How to solve "All com.android.support libraries must use the exact same version specification" issue?

具体来说,如果出现问题的插件已经是最新的怎么解决?

我是 Android 编程的新手,而且绝对是 Gradle 概念的新手。这个问题是在我按照互联网上的一些教程将新的依赖项添加到主应用程序后出现的。

All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes). Found versions 28.0.0, 27.1.1. Examples include com.android.support:animated-vector-drawable:28.0.0 and com.android.support:support-media-compat:27.1.1

但我没有声明 "support-media-compat:27.1.1" 的依赖关系。所以我想这一定是我使用的插件之一。问题是,我怎么知道是哪个插件导致的?

经过长时间的谷歌搜索并获得了大量的红鲱鱼,我发现您可以直接在控制台中使用 gradle 命令扩展依赖关系树:

./gradlew app:dependencies

然后让我发现了这个:

+--- org.jetbrains.anko:anko:0.10.8
....
|    +--- org.jetbrains.anko:anko-appcompat-v7:0.10.8
|    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.0 -> 1.3.21 (*)
|    |    +--- com.android.support:appcompat-v7:27.1.1 -> 28.0.0 (*)
|    |    +--- org.jetbrains.anko:anko-support-v4:0.10.8
|    |    |    +--- org.jetbrains.kotlin:kotlin-stdlib:1.3.0 -> 1.3.21 (*)
|    |    |    +--- com.android.support:support-v4:27.1.1
|    |    |    |    +--- com.android.support:support-compat:27.1.1 -> 28.0.0 (*)
|    |    |    |    +--- com.android.support:support-media-compat:27.1.1    <-----
|    |    |    |    |    +--- com.android.support:support-annotations:27.1.1 -> 28.0.0
|    |    |    |    |    \--- com.android.support:support-compat:27.1.1 -> 28.0.0 (*)
|    |    |    |    +--- com.android.support:support-core-utils:27.1.1 -> 28.0.0 (*)
|    |    |    |    +--- com.android.support:support-core-ui:27.1.1 -> 28.0.0 (*)
|    |    |    |    \--- com.android.support:support-fragment:27.1.1 -> 28.0.0 (*)
....

现在我知道那是因为 anko:0.10.8。我确实记得这个问题是在我添加了 anko 插件后开始出现的。从我之前阅读的答案来看,通常解决方案是使用最新版本的插件。但是当我看到the plugin version的时候,最新的已经是0.10.8了。所以我对下一步该做什么感到困惑。

顺便说一句,这是我的依赖项:

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.example.test"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.github.PhilJay:MPAndroidChart:v3.1.0'
    implementation 'com.github.StevenDXC:DxLoadingButton:2.2'

    implementation 'com.thoughtbot:expandablerecyclerview:1.3'

    implementation "com.squareup.retrofit2:retrofit:2.3.0"
    implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
    implementation "com.squareup.retrofit2:converter-gson:2.3.0"

    implementation "io.reactivex.rxjava2:rxandroid:2.0.1"

    implementation "org.jetbrains.anko:anko:$anko_version"

    implementation 'com.google.firebase:firebase-core:16.0.9'
}

apply plugin: 'com.google.gms.google-services'

我也尝试过将 appcompat 降级为 27.1.1 的解决方案,这需要我也将 android compileSdkVersion 降级为 27。但即使改变了所有这些,这会导致与其他插件的版本不兼容。

如何解决这个问题,并且仍然使用 anko 插件?

我有同样的问题,你应该添加错误文本中告诉你的依赖项,, 例如对于你的情况添加:

实施'com.android.support:animated-vector-drawable:28.0.0'

实施'com.android.support:support-media-compat:27.1.1'

并同步您的 gradle

由于您使用了org.jetbrains.anko:anko,所以出现了这个问题。它包含完整的捆绑设置。相反,您需要避免使用 SDK 的捆绑版本。而是只使用需要的功能。

如果你只想使用 anko 进行 SQLite 管理,那么只使用下面的依赖项。

// Anko SQLite
implementation "org.jetbrains.anko:anko-sqlite:$anko_version"

因此,请不要使用完整捆绑的 sdk,而是使用仅具有以下所需功能的 sdk。

dependencies {
    // Anko Commons
    implementation "org.jetbrains.anko:anko-commons:$anko_version"

    // Anko Layouts (These are the dependencies which causing the issue.)
    implementation "org.jetbrains.anko:anko-sdk25:$anko_version" // sdk15, sdk19, sdk21, sdk23 are also available
    implementation "org.jetbrains.anko:anko-appcompat-v7:$anko_version"

    // Coroutine listeners for Anko Layouts
    implementation "org.jetbrains.anko:anko-sdk25-coroutines:$anko_version"
    implementation "org.jetbrains.anko:anko-appcompat-v7-coroutines:$anko_version"

    // Anko SQLite
    implementation "org.jetbrains.anko:anko-sqlite:$anko_version"
}

参考完整文档 here

您需要在 app/build.gradle.

中添加与最新版本冲突的依赖项

因此,如果它告诉您某些库正在使用 com.android.support:support-media-compat:27.1.1,那么您需要在 app/build.gradle 中添加您正在使用的最新版本的依赖项,即在您的情况下, com.android.support:support-media-compat:28.0.0

继续这样做,直到您应用中的所有依赖项都使用最新版本。