Android依赖项的编译和运行时版本不同


105

将Android Studio从Canary 3更新到Canary 4后,在构建时会引发以下错误。

Android依赖项'com.android.support:support-support-v4'对于编译(25.2.0)和运行时(26.0.0-beta2)类路径具有不同的版本。您应该通过DependencyResolution手动设置相同的版本。

我在整个项目中进行了一次完整的搜索,25.1.0没有使用该版本。

App-build.gradle

android {
compileSdkVersion 26
buildToolsVersion '26.0.0'


defaultConfig {
    applicationId "com.xxx.xxxx"
    minSdkVersion 14
    targetSdkVersion
    versionCode 1
    versionName "1.0"
    multiDexEnabled true

}


buildTypes {
    debug {
        debuggable true
    }
    release {
        debuggable false
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    lintOptions {
        abortOnError false
    }

}}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
testImplementation 'junit:junit:4.12'
implementation project(':core')
implementation com.google.android.gms:play-services-gcm:9.0.0'

implementation('com.crashlytics.sdk.android:crashlytics:2.6.5@aar') {
    transitive = true
}
implementation 'com.android.support:multidex:1.0.1'
implementation 'com.flurry.android:analytics:7.0.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.6.0'
implementation 'com.jakewharton:butterknife:8.6.0'
implementation 'com.android.support.constraint:constraint-layout:1.0.2'
}

Library-build.gradle:

apply plugin: 'com.android.library'
android {
compileSdkVersion 26
buildToolsVersion '26.0.0'

defaultConfig {
    minSdkVersion 14
    targetSdkVersion
    versionCode 1
    versionName "1.0"
}

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation files('libs/model.jar')
testImplementation 'junit:junit:4.12'
implementation 'com.android.support:percent:26.0.0-beta2'
implementation 'com.android.support:appcompat-v7:26.0.0-beta2'
implementation 'com.android.support:support-core-utils:26.0.0-beta2'

implementation 'com.squareup.retrofit2:retrofit:2.0.2'
implementation 'com.squareup.picasso:picasso:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.2'
implementation 'com.squareup.okhttp3:logging-interceptor:3.2.0'
implementation 'uk.co.chrisjenx:calligraphy:2.2.0'
implementation 'com.google.code.gson:gson:2.2.4'
implementation 'com.android.support:design:26.0.0-beta2'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.1'

}

注意:项目在Canary 3中的建设情况良好


我也遇到了同样的问题,因为我在我的应用程序中使用了两个模块,因此请确保对所有gradle文件使用相同的版本代码。
Nadeem Bhat

Answers:


136

在您的构建脚本(build.gradle根目录)中使用以下代码:

subprojects {
  project.configurations.all {
     resolutionStrategy.eachDependency { details ->
        if (details.requested.group == 'com.android.support'
              && !details.requested.name.contains('multidex') ) {
           details.useVersion "version which should be used - in your case 26.0.0-beta2"
        }
     }
  }
}

8
它对我有用,请记住将其更改为版本号,如果仅复制并粘贴该版本号将失败
John Starr Dewar

2
最好的,与rn 0.55一起使用,gradle 4.1,构建gradle工具3.0.1
Jok,

1
确保包括!details.requested.name.contains('multidex')真正帮助了我的人。
乔纳·史达琳

2
我尝试了此操作,但它仅适用于com.android.support冲突。对于com.google.firebase:firebase-analytics冲突无效。“包含”似乎匹配了太多的程序包。我在这篇文章中使用了更简单的解决方案来解决所有冲突,并且效果很好。
雅各布·乔尔

2
@ user3908686解决了问题,但请解释一下,为什么我们需要添加此内容?
ArgaPK '18年

81

我有同样的错误,解决我问题的方法是。在我的库中,不是使用编译或实现,而是使用“ api”。所以最后我的依赖:

dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api files('libs/model.jar')
testApi 'junit:junit:4.12'
api 'com.android.support:percent:26.0.0-beta2'
api 'com.android.support:appcompat-v7:26.0.0-beta2'
api 'com.android.support:support-core-utils:26.0.0-beta2'

api 'com.squareup.retrofit2:retrofit:2.0.2'
api 'com.squareup.picasso:picasso:2.4.0'
api 'com.squareup.retrofit2:converter-gson:2.0.2'
api 'com.squareup.okhttp3:logging-interceptor:3.2.0'
api 'uk.co.chrisjenx:calligraphy:2.2.0'
api 'com.google.code.gson:gson:2.2.4'
api 'com.android.support:design:26.0.0-beta2'
api 'com.github.PhilJay:MPAndroidChart:v3.0.1'
}

您可以在此链接中找到有关“ api”,“实现”的更多信息https://stackoverflow.com/a/44493379/3479489


36
所有android studio都建议使用实现。此另类解决方案也可以工作。Android Studio的Google工程师需要吸取教训,以向世界学习。多么令人沮丧的工具
Siddharth

3
它不能解决问题,消息显示:“ Android依赖项'......'具有不同的编译版本”
Jorgesys

为我工作。谢谢
段阮

@KeithLoughnane这不是一个坏习惯,是正确的做法以及文档推荐的方式
Yayo Arellano

1
如果绝对需要明智地使用api,建议使用@YayoArellano实现。这把所有东西扔在墙上,看看是什么阻碍了编程。其中一些可能需要api,但并非全部。您暴露的太多了。
基思·洛夫纳

22

通过运行gradle -q dependencies项目的正确命令,您应该能够确切地看到哪个依赖项将奇数版本作为传递性依赖项拉入,如下所述:

https://docs.gradle.org/current/userguide/userguide_single.html#sec:listing_dependencies

一旦找到了原因,就可以在gradle文件中为该特定依赖项添加排除项,例如:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}

嗨,我运行gradle依赖项命令,并将屏幕快照网址发布在imgur.com/dL35BaN。我从未在项目中使用Firebase。在gcm中添加了该行,但是它没有用
DroidLearner

@DroidLearner我可能丢失了一些东西,但是在您发布的屏幕快照中看不到对com.android.support:support-compat的任何引用。在该屏幕快照中还存在一个警告,指出“编译”配置,我在OP的gradle文件中看不到该配置。它可能来自:core子模块。您可以从那里发布相关的gradle信息吗?
jdonmoyer

嗨,在这里发布带有依赖关系树的整个gradle文件。。app gradle文件-> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716核心gradle文件-> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d依赖关系树-> gist.github。 com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee 希望这会有所帮助。
DroidLearner

1
看起来该库的旧版本已被firebase引入,而后者又是gms的传递依赖项。您可以通过在其他任何依赖项之前添加:实现'com.android.support:support-v4:26.0.0-beta2'来实现此目的。长期关闭可传递依赖项以支持显式或使用resolutionStrategy(docs.gradle.org/current/dsl/…)可能是一种更好的方法。
jdonmoyer

1
谢谢。不知何故设法解决了传递依赖。Gradle构建成功。在运行时,所有库类均显示错误。错误:包retrofit2不存在错误:包android.support.v7.app不存在错误:包com.google.gson不存在。在编译时它没有显示任何错误。
DroidLearner

16

经过很多时间并从一个比我更了解android的朋友那里获得帮助:app / build.gradle

android {
    compileSdkVersion 27

    // org.gradle.caching = true

    defaultConfig {
        applicationId "com.cryptoviewer"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 196
        versionName "16.83"
        // ndk {
        //     abiFilters "armeabi-v7a", "x86"
        // }
    }

和依赖

dependencies {
    implementation project(':react-native-camera')
   //...
    implementation "com.android.support:appcompat-v7:26.1.0" // <= YOU CARE ABOUT THIS
    implementation "com.facebook.react:react-native:+"  // From node_modules
}

在build.gradle中

allprojects {
   //...
    configurations.all {
        resolutionStrategy.force "com.android.support:support-v4:26.1.0"
    }

在gradle.properties中

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M

4
resolutionStrategy.force是唯一对我有用的东西。谢谢!
Orion Edwards

7

对我来说,答案是也将其添加到我的build.gradle文件中:

configurations.all {
  resolutionStrategy.eachDependency { details ->
      if (details.requested.group == 'com.android.support'
              && !details.requested.name.contains('multidex') ) {
          details.useVersion "26.1.0"
      }
  }
}

就我而言,必须将解决方案策略封装在一起configurations.all { .. }。我将configurations.all块直接放入app/build.gradle文件中(即configurations.all未嵌套在其他任何文件中)


5

这对我有用:

app/build.gradle在依赖性部分中添加以下行:

implementation "com.android.support:appcompat-v7:27.1.0"

或者:27.1.1就我而言


4

将此代码添加到您的项目级别的build.gradle文件中。

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "version which should be used - in your case 28.0.0-beta2"
            }
        }
    }
}

样例代码:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    repositories {
        google()
        jcenter()
        maven { url 'https://maven.fabric.io/public' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        classpath 'io.fabric.tools:gradle:1.31.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

    }
}

allprojects {
    repositories {
        google()
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "28.0.0"
            }
        }
    }
}

3

如果有人在2019年遇到此依赖关系问题,请将Android Studio更新到3.4或更高版本



2

我按照上述Eddi所说的解决了这个问题,

 resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "26.1.0"
            }
        }

2

将我有冲突的依赖项从实现切换到api就可以了。这是Minderk撰写的一篇很好的文章,解释了它们之间的区别。

https://medium.com/mindorks/implementation-vs-api-in-gradle-3-0-494c817a6fa

编辑:

这也是我的依赖解决方案

 subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.android.support'
                        && !details.requested.name.contains('multidex')) {
                    details.useVersion "28.0.0"
                }
                if (details.requested.group == 'com.google.android.gms'
                        && details.requested.name.contains('play-services-base')) {
                    details.useVersion "15.0.1"
                }
                if (details.requested.group == 'com.google.android.gms'
                        && details.requested.name.contains('play-services-tasks')) {
                    details.useVersion "15.0.1"
                }
            }
        }
    }

2

在您的库项目中看到,使compileSdkVersiontargetSdkVersion版本与您的应用程序处于同一级别

android {
    compileSdkVersion 28

    defaultConfig {
        consumerProguardFiles 'proguard-rules.txt'
        minSdkVersion 14
        targetSdkVersion 28
    }
}

还要使所有依赖项都处于同一级别



1

只需将这些行添加到您的build.gradle文件中

resolutionStrategy.force“ com.android.support:support-media-compat:26.0.0-beta2”

resolutionStrategy.force“ com.android.support:support-v4:26.0.0-beta2”


0

就我而言,我在两个不同的模块中拥有以下实现的两个不同版本,因此我将两个实现都更改为版本:即6.0.2,并且可以正常工作。您可能还需要编写依赖性解析,请参见接受的答案。

应用模块

implementation 'com.karumi:dexter:5.0.0'

公共模块

implementation 'com.karumi:dexter:6.0.2'

0

    configurations.all {
        resolutionStrategy.force
        //"com.android.support:appcompat-v7:25.3.1"
        //here put the library that made the error with the version you want to use
    }

将此添加到gradle(项目)里面 allprojects


-7

将硬编码版本替换为+示例:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'

7
不完全是最佳实践,因为这可能会导致图书馆从您手中逃脱。例如 它们更改了新版本中的处理方式,突然之间您的代码不起作用。虽然您应努力使用最新版本,但应在首次测试后手动设置版本号,以防止意外的崩溃和错误。
约拿·史达琳

1
这不是一个好习惯。除了@JonahStarling所说的以外,如果关闭了离线功能,它也会影响Gradle构建性能。
Ankit Batra
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.