简体   繁体   English

如何使用Gradle的依赖树来解决android支持库版本不匹配?

[英]How to use Gradle's dependency tree to resolve android support library version mismatch?

the catalyst 催化剂

I upgraded Android Studio to 2.3, and Gradle plugin to 3.3 我将Android Studio升级到2.3,将Gradle插件升级到3.3

the initial problem 最初的问题

After updating the Gradle plugin to 3.3, I received the error "Error:The SDK Build Tools revision (23.0.3) is too low for project ':mymodulename'. Minimum required is 25.0.0" 将Gradle插件更新为3.3后,我收到错误“错误:SDK Build Tools修订版(23.0.3)对于项目来说太低了':mymodulename'。最低要求是25.0.0”

I tried adjusting both buildToolsVersion to 25.0.2 and compileSdkVersion to 25, along with all the com.android.support dependencies (since their major version needs to match compileSdkVersion). 我尝试将buildToolsVersion调整为25.0.2并将compileSdkVersion调整为25,以及所有com.android.support依赖项(因为它们的主要版本需要匹配compileSdkVersion)。 That adjustment cleared this problem, but then I realized my app doesn't support Nougat yet so I reduced the compileSdkVersion to my targetSdkVersion of 23. The error message about build tools being too low was still gone, so I thought I was in the clear. 这个调整清除了这个问题,但后来我意识到我的应用程序还不支持Nougat所以我将compileSdkVersion减少到了我的targetSdkVersion 23.关于构建工具太低的错误信息仍然没有了,所以我觉得我很清楚。

the first dependency error 第一个依赖错误

After knocking compileSdkVersion down to 23 I tried to rebuild, and saw several errors similar to "Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'". 在将compileSdkVersion击倒到23之后,我尝试重建,并看到了几个类似于“错误的错误:(3)错误检索项目的父项:找不到与给定名称匹配的资源'android:TextAppearance.Material.Widget.Button.Borderless。有色'”。 I realized that I had forgotten to change my com.android.support dependencies such that their major version matched the lower compileSdkVersion again, so I bumped them down to 23.3.0 我意识到我忘记改变我的com.android.support依赖项,使得它们的主要版本再次与较低的compileSdkVersion匹配,所以我将它们降低到23.3.0

the second dependency error 第二个依赖错误

After resolving the first dependency error, I was able to compile and run my app again. 解决了第一个依赖性错误后,我能够再次编译并运行我的应用程序。 However, there was still a red squiggle beneath my first com.android.support dependency, with the error note "all com.android.support libraries must usew the exact same version specification (mixing versions can leads to runtime crashes). Found versions 24.0.0, 23.3.0. Examples include com.android.support:support-v4:24.0.0 and com.android.support:animated-vector-drawable: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“

Nothing in my build.gradle specifically references 24.0.0, behold: 我的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'

the dependency tree 依赖树

In order to figure out where the 24.0.0 dependency was coming from, I created a dependency tree using './gradlew -q dependencies mymodulename:dependencies --configuration compile'. 为了弄清楚24.0.0依赖的来源,我使用'./gradlew -q dependencies mymodulename:dependencies --configuration compile'创建了一个依赖树。 The output is: 输出是:

    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)

the questions 问题

  1. What does the dependency tree syntax 'lib version -> different lib version' mean? 依赖树语法'lib version - >不同的lib版'是什么意思? Specifically, when the tree says "com.android.support:support-v4:23.3.0 -> 24.0.0", what does it mean? 具体来说,当树说“com.android.support:support-v4:23.3.0 - > 24.0.0”时,它是什么意思?

  2. If there are implicit requirements for com.android.support version 24.xx libraries in some of my other dependencies (see com.google.android.gms:play-services-basement:10.0.1 depending on com.android.support:support-v4:24.0.0), why didn't this build.gradle throw errors prior to the Android Studio, Gradle plugin, and buildToolsVersion update mentioned earlier? 如果我的其他一些依赖项中有com.android.support版本24.xx库的隐式要求(请参阅com.google.android.gms:play-services-basement:10.0.1,具体取决于com.android.support:support -v4:24.0.0),为什么在之前提到的Android Studio,Gradle插件和buildToolsVersion更新之前没有这个build.gradle抛出错误?

  3. How can I make sure all my dependencies are compatible with compileSdkVersion 23? 如何确保所有依赖项与compileSdkVersion 23兼容?

Specifically, when the tree says "com.android.support:support-v4:23.3.0 -> 24.0.0", what does it mean? 具体来说,当树说“com.android.support:support-v4:23.3.0 - > 24.0.0”时,它是什么意思?

It means that a library has com.android.support:support-v4:23.3.0 as nested dependency but you are just using another and higher version of the same dependencies, in this case com.android.support:support-v4:24.0.0 . 这意味着库具有com.android.support:support-v4:23.3.0作为嵌套依赖项,但您只是使用相同依赖项的另一个更高版本,在本例中为com.android.support:support-v4:24.0.0
In other word your project is using the com.android.support:support-v4:24.0.0 换句话说,您的项目使用的com.android.support:support-v4:24.0.0

why didn't this build.gradle throw errors prior to the Android Studio, Gradle plugin, and buildToolsVersion update mentioned earlier? 为什么在之前提到的Android Studio,Gradle插件和buildToolsVersion更新之前没有这个build.gradle抛出错误?

Because you have updated the Gradle plugin to 3.3 that has this kind of check. 因为您已将Gradle插件更新为具有此类检查的3.3。

How can I make sure all my dependencies are compatible with compileSdkVersion 23? 如何确保所有依赖项与compileSdkVersion 23兼容?

It is quite difficult to have. 这很难。
The only way is to check all dependencies, but I suggest you using: 唯一的方法是检查所有依赖项,但我建议您使用:

compileSdkVersion 25
targetSdkVersion  23

In general it is a good idea to use the latest version of buildToolsVersion in any case, independently by the version of support libraries used. 通常,在任何情况下都使用最新版本的buildToolsVersion是一个好主意,独立于所使用的支持库的版本。

Moreover. 此外。 It is strongly recommended that you always compile with the latest SDK . 强烈建议您始终使用最新的SDK进行编译 It means that today you should use compileSdkVersion 25. 这意味着今天你应该使用compileSdkVersion 25。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何从Gradle Dependency中找到库的版本? Android Studio - How to find the version of library from Gradle Dependency? Android Studio 使用android-gradle 3在Android库中公开支持库依赖项的正确方法是什么? - What's the correct way of exposing a support library dependency in an Android library using android-gradle 3? 如何解决Android Studio中的以下gradle依赖项不匹配问题? 问题在下面提到: - How can I resolve the following gradle dependency mismatch problem in Android Studio? The issue is mentioned below: 防止支持库的Gradle依赖性被更新版本覆盖 - Prevent Gradle dependency for support library from being overridden by newer version 支持库和compileSdkVersion版本不匹配 - Support library and compileSdkVersion version mismatch Gradle无法解析支持库 - Gradle does not resolve support library 如何知道Gradle文件中使用的android库的更新版本号 - How to know the updated version number of android library to use in gradle file Gradle无法找到依赖项(Android支持库) - Gradle can't find dependency (Android support library) Android Gradle库依赖项 - Android Gradle library dependency 如何使用 Gradle resolutionStrategy 强制依赖版本? - How to use Gradle resolutionStrategy to force dependency version?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM