【问题标题】:How to use Gradle's dependency tree to resolve android support library version mismatch?如何使用 Gradle 的依赖树解决 android 支持库版本不匹配问题?
【发布时间】:2017-07-29 19:43:54
【问题描述】:

催化剂

我将 Android Studio 升级到 2.3,将 Gradle 插件升级到 3.3

最初的问题

将 Gradle 插件更新到 3.3 后,我收到错误消息“错误:SDK 构建工具修订版 (23.0.3) 对于项目 ':mymodulename' 而言太低。最低要求是 25.0.0”

我尝试将 buildToolsVersion 调整为 25.0.2 并将 compileSdkVersion 调整为 25,以及所有 com.android.support 依赖项(因为它们的主要版本需要匹配 compileSdkVersion)。该调整解决了这个问题,但后来我意识到我的应用程序还不支持 Nougat,所以我将 compileSdkVersion 减少到我的 targetSdkVersion 23。关于构建工具太低的错误消息仍然消失了,所以我以为我很清楚.

第一个依赖错误

在将 compileSdkVersion 降低到 23 后,我尝试重建,并看到几个类似于“错误:(3) 检索项目的父项时出错:找不到与给定名称匹配的资源 'android:TextAppearance.Material.Widget.Button .Borderless.Colored'”。我意识到我忘记更改我的 com.android.support 依赖项,以便它们的主要版本再次匹配较低的 compileSdkVersion,所以我将它们降低到 23.3.0

第二个依赖错误

解决第一个依赖错误后,我能够再次编译和运行我的应用程序。但是,在我的第一个 com.android.support 依赖项下仍然有一个红色波浪线,错误说明“所有 com.android.support 库必须使用完全相同的版本规范(混合版本可能导致运行时崩溃)。找到版本 24.0 .0, 23.3.0。示例包括 com.android.support:support-v4:24.0.0 和 com.android.support:animated-vector-drawable:23.3.0"

我的 build.gradle 中没有任何内容专门引用 24.0.0,看吧:

apply plugin: 'com.android.application'


android {
    compileSdkVersion 23
    buildToolsVersion '25.0.2'


    defaultConfig {
        applicationId ...
        minSdkVersion 16
        targetSdkVersion 23
        versionCode ...
        versionName ...
    }
    buildTypes {
        debug{
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions{

        //check for errors in release builds,
        // but continue the build even when errors are found:
        abortOnError false
    }
    dexOptions{
        jumboMode true
    }

}

repositories {
    // You can also use jcenter if you prefer
    mavenCentral()
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    //android support libs etc.
    compile 'com.android.support:appcompat-v7:23.3.0'
    compile 'com.android.support:support-v13:23.3.0'
    compile 'com.android.support:mediarouter-v7:23.3.0'
    compile 'com.android.support:recyclerview-v7:23.3.0'
    //snackbar support
    compile 'com.android.support:design:23.3.0'

    //Facebook Android SDK
    compile 'com.facebook.android:facebook-android-sdk:4.7.0'
    //Facebook Audience Network SDK. Only versions 4.6.0 and above are available
    compile 'com.facebook.android:audience-network-sdk:4.7.0'

    //gplay services dependencies
    compile 'com.google.android.gms:play-services-plus:10.0.1'
    compile 'com.google.android.gms:play-services-analytics:10.0.1'
    compile 'com.google.android.gms:play-services-location:10.0.1'

    //provides Firebase Analytics
    compile 'com.google.firebase:firebase-core:10.0.1'

    //provides Google Mobile Ads SDK, a.k.a the AdMob service.
    compile 'com.google.firebase:firebase-ads:10.0.1'

    //dependencies required by the InMobi ads SDK
    compile 'com.squareup.picasso:picasso:2.5.2'

}

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

依赖树

为了找出 24.0.0 依赖项的来源,我使用“./gradlew -q dependencies mymodulename:dependencies --configuration compile”创建了一个依赖项树。输出是:

    compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:23.3.0
|    +--- com.android.support:support-vector-drawable:23.3.0
|    |    \--- com.android.support:support-v4:23.3.0 -> 24.0.0
|    |         \--- com.android.support:support-annotations:24.0.0
|    +--- com.android.support:animated-vector-drawable:23.3.0
|    |    \--- com.android.support:support-vector-drawable:23.3.0 (*)
|    \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*)
+--- com.android.support:support-v13:23.3.0
|    \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*)
+--- com.android.support:mediarouter-v7:23.3.0
|    +--- com.android.support:appcompat-v7:23.3.0 (*)
|    \--- com.android.support:palette-v7:23.3.0
|         \--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*)
+--- com.android.support:design:23.3.0
|    +--- com.android.support:appcompat-v7:23.3.0 (*)
|    +--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*)
|    \--- com.android.support:recyclerview-v7:23.3.0
|         +--- com.android.support:support-v4:23.3.0 -> 24.0.0 (*)
|         \--- com.android.support:support-annotations:23.3.0 -> 24.0.0
+--- com.facebook.android:facebook-android-sdk:4.7.0
|    +--- com.parse.bolts:bolts-android:1.2.0
|    \--- com.android.support:support-v4:[22,23) -> 24.0.0 (*)
+--- com.facebook.android:audience-network-sdk:4.7.0
|    \--- com.google.android.gms:play-services-ads:7.8.0 -> 10.0.1
|         +--- com.google.android.gms:play-services-ads-lite:10.0.1
|         |    \--- com.google.android.gms:play-services-basement:10.0.1
|         |         \--- com.android.support:support-v4:24.0.0 (*)
|         +--- com.google.android.gms:play-services-base:10.0.1
|         |    +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         |    \--- com.google.android.gms:play-services-tasks:10.0.1
|         |         \--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         +--- com.google.android.gms:play-services-clearcut:10.0.1
|         |    +--- com.google.android.gms:play-services-base:10.0.1 (*)
|         |    \--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         \--- com.google.android.gms:play-services-gass:10.0.1
|              \--- com.google.android.gms:play-services-basement:10.0.1 (*)
+--- com.google.android.gms:play-services-plus:10.0.1
|    +--- com.google.android.gms:play-services-base:10.0.1 (*)
|    \--- com.google.android.gms:play-services-basement:10.0.1 (*)
+--- com.google.android.gms:play-services-analytics:10.0.1
|    +--- com.google.android.gms:play-services-analytics-impl:10.0.1
|    |    +--- com.google.android.gms:play-services-base:10.0.1 (*)
|    |    \--- com.google.android.gms:play-services-basement:10.0.1 (*)
|    +--- com.google.android.gms:play-services-base:10.0.1 (*)
|    +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|    \--- com.google.android.gms:play-services-tagmanager-v4-impl:10.0.1
|         +--- com.google.android.gms:play-services-analytics-impl:10.0.1 (*)
|         +--- com.google.android.gms:play-services-base:10.0.1 (*)
|         \--- com.google.android.gms:play-services-basement:10.0.1 (*)
+--- com.google.android.gms:play-services-location:10.0.1
|    +--- com.google.android.gms:play-services-base:10.0.1 (*)
|    +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|    \--- com.google.android.gms:play-services-tasks:10.0.1 (*)
+--- com.google.firebase:firebase-core:10.0.1
|    \--- com.google.firebase:firebase-analytics:10.0.1
|         +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         +--- com.google.firebase:firebase-common:10.0.1
|         |    +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|         |    \--- com.google.android.gms:play-services-tasks:10.0.1 (*)
|         \--- com.google.firebase:firebase-analytics-impl:10.0.1
|              +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|              +--- com.google.firebase:firebase-iid:10.0.1
|              |    +--- com.google.android.gms:play-services-basement:10.0.1 (*)
|              |    \--- com.google.firebase:firebase-common:10.0.1 (*)
|              \--- com.google.firebase:firebase-common:10.0.1 (*)
+--- com.google.firebase:firebase-ads:10.0.1
|    +--- com.google.android.gms:play-services-ads:10.0.1 (*)
|    \--- com.google.firebase:firebase-analytics:10.0.1 (*)
+--- com.squareup.picasso:picasso:2.5.2
\--- com.android.support:recyclerview-v7:23.3.0 (*)

(*) - dependencies omitted (listed previously)

问题

  1. 依赖树语法“lib 版本 -> 不同的 lib 版本”是什么意思?具体来说,当树说“com.android.support:support-v4:23.3.0 -> 24.0.0”时,它是什么意思?

  2. 如果在我的一些其他依赖项中对 com.android.support 版本 24.xx 库有隐式要求(请参阅 com.google.android.gms:play-services-basement:10.0.1,具体取决于 com .android.support:support-v4:24.0.0),为什么这个build.gradle没有在前面提到的Android Studio、Gradle插件和buildToolsVersion更新之前抛出错误?

  3. 如何确保我的所有依赖项都与 compileSdkVersion 23 兼容?

【问题讨论】:

  • 如果使用 25 编译但使用版本 23 支持库会发生什么情况?
  • 您应该将依赖关系树作为文本发布。突出显示它并按 Ctrl-K 以保留格式。此键盘快捷键添加了代码块所需的空格。
  • 请记住,compileSdkVersion 不会改变您的应用程序的行为 - 这将是 targetSdkVersion,如 this blog post 中所述。您应该始终使用最新版本的 Android 进行编译,即使您没有针对它。
  • @ianhanniballake compileSdkVersion 本身不会改变应用程序在运行时的行为,但它确实开辟了使用可能在旧系统上崩溃的新 API 的可能性(假设调用没有通过支持库)。我更喜欢让计算机努力防止人为错误而不是相反,并且将编译错误作为安全网很好。尽管如此,链接的文章还是为针对最新的 SDK 进行编译提供了一个引人注目的观点;我想您只需要大量依赖 Lint 并检查文档中的“在 API 级别 X 中添加”注释(至少)以了解不熟悉的方法
  • @Code-Apprentice 如果我针对 25 进行编译并使用版本 23 的支持库,我可以毫无错误地编译,但 Gradle 会用愤怒的曲线强调版本 23 的依赖关系。悬停注释说“此支持库不应使用与 compileSdkVersion (25) 不同的版本 (23)”

标签: android android-studio gradle android-gradle-plugin


【解决方案1】:

具体来说,当树说“com.android.support:support-v4:23.3.0 -> 24.0.0”时,是什么意思?

这意味着库具有 com.android.support:support-v4:23.3.0 作为嵌套依赖项,但您只是使用相同依赖项的另一个更高版本,在本例中为 com.android.support:support-v4:24.0.0
换句话说,您的项目正在使用com.android.support:support-v4:24.0.0

为什么这个 build.gradle 在前面提到的 Android Studio、Gradle 插件和 buildToolsVersion 更新之前没有抛出错误?

因为您已将具有此类检查的 Gradle 插件更新到 3.3。

如何确保我的所有依赖项都与 compileSdkVersion 23 兼容?

很难拥有。
唯一的方法是检查所有依赖项,但我建议您使用:

compileSdkVersion 25
targetSdkVersion  23

一般来说,在任何情况下都使用最新版本的buildToolsVersion 是个好主意,这取决于所使用的支持库的版本。

此外。 强烈建议您始终使用最新的 SDK 编译。这意味着今天你应该使用compileSdkVersion 25。

【讨论】:

  • 好的,很有趣。我玩弄了其他依赖项,似乎 com.google.android.gms 和 com.google.firebase 条目引入了 24.x.x 支持库版本;将 com.google.android.gms 和 com.google.firebase 条目删除到版本 9.0.0 允许支持 lib 23.x.x 和 compileSdkVersion 23 工作而不会出现错误符号。
  • 关于您对使用最新 SDK 进行编译的评论,这不会有意外使用在我的目标 API 级别中不可用的新 API 的风险吗? Lint 可能会捕获它们,但不会出现编译错误,而且我很确定会有运行时错误......使用高于 targetSdkVersion 的 compileSdkVersion 有什么好处?您是否有官方参考建议开发人员始终使用最新的 SDK 版本进行编译?
  • @CCJ 检查此链接:medium.com/google-developers/…。作者是 Google 的 Android 开发人员倡导者:特别检查以下部分:“应该强调的是,更改 compileSdkVersion 不会更改运行时行为。虽然更改 compileSdkVersion 时可能会出现新的编译器警告/错误,但不包括您的 compileSdkVersion在您的 APK 中:纯粹在编译时使用"
猜你喜欢
  • 2013-07-08
  • 2017-08-09
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多