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で問題なく構築されていました


アプリで2つのモジュールを使用しているため、同じ問題にも直面していました。すべてのGradleファイルに同じバージョンのコードを使用していることを確認してください。
Nadeem Bhat

回答:


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
それは私にとってはうまくいきました、details.useVersionをバージョン番号に変更することを忘れないでください。コピーして貼り付けるだけでは失敗します
John Starr Dewar

2
最高の、rn 0.55、gradle 4.1で動作し、gradleツール3.0.1をビルド
Nerius Jok

1
!details.requested.name.contains('multidex')本当に助けてくれた人を必ず含めてください。
ジョナスターリング2018年

2
私はこれを試しましたが、com.android.supportの競合でのみ機能しました。com.google.firebase:firebase-analyticsの競合では機能しませんでした。「含む」はあまりにも多くのパッケージに一致するようです。この投稿では、すべての競合に対して、代わりに単純な解決策を使用しましたが、完全に機能しました。
ジェイコブジョエル

2
@ user3908686は問題を解決しましたが、説明してください、なぜこれを追加する必要があるのですか?
ArgaPK

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スタジオのGoogleエンジニアは、世界から学ぶためのレッスンが必要です。なんてイライラするツール
Siddharth

3
それは問題を解決しません、メッセージは言います:「Android依存関係 '...............'はコンパイルのために異なるバージョンを持っています」
Jorgesys

私のために働きなさい。ありがとう
Duan Nguyen

@KeithLoughnaneこれは悪い習慣ではありません。正しい方法であり、ドキュメントが推奨する方法でもあります
Yayo Arellano

1
@YayoArellano実装は、絶対に必要なAPIの賢明な使用で推奨されるものです。これはすべてを壁に投げつけ、プログラミングの問題を突き止めます。それらのいくつかはapiを必要とするかもしれませんが、それらのすべてではありません。露出しすぎです。
キース・ローナン、

22

gradle -q dependenciesここで説明するように、プロジェクトに対して正しいコマンドを実行することで、どの依存関係が一時的な依存関係として奇数バージョンを引き込んでいるかを正確に確認できるはずです。

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

何が引き込まれているのかを追跡したら、gradleファイルの特定の依存関係にexcludeを追加できます。

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

こんにちは、gradle依存コマンドを実行し、スクリーンショットのURL、imgur.com / dL35BaNを投稿しています。プロジェクトでFirebaseを使用することはありません。その行を
gcm

@DroidLearner何か不足している可能性がありますが、投稿したスクリーンショットにcom.android.support:support-compatへの参照が表示されません。また、そのスクリーンショットには、OPのGradleファイルに存在しない「コンパイル」構成を参照する警告があります。:coreサブモジュールからのものである可能性があります。そこから関連するGradle情報を投稿できますか?
jdonmoyer 2017年

こんにちは、依存関係ツリーを含むGradleファイル全体をここに投稿します。アプリのGradleファイル-> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716コアGradleファイル-> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d依存関係ツリー-> gist.github。 com / anonymous / 71dd33b6fa4dc63dd357889e8aff01ee これがお役に立てば幸いです。
DroidLearner 2017

1
古いバージョンのライブラリがfirebaseによって取り込まれているようです。これはgmsの推移的な依存関係です。他の依存関係の前に実装「com.android.support:support-v4:26.0.0-beta2」を追加することで、おそらくこれを機能させることができます。明示的であるかresolutionStrategy(docs.gradle.org/current/dsl/…)を使用することを優先して推移的な依存関係を長期間オフにすることは、おそらくより良いアプローチです。
jdonmoyer 2017

1
ありがとう。どういうわけか、推移的な依存関係を修正することができました。Gradleのビルドが成功しました。実行時に、すべてのライブラリクラスでエラーが表示されます。エラー:パッケージretrofit2が存在しませんエラー:パッケージandroid.support.v7.appが存在しませんエラー:パッケージcom.google.gsonが存在しません。コンパイル時にエラーは表示されませんでした。
DroidLearner 2017

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以降に更新してください


3

私はandroid / build.gradleファイルのGradle依存関係をアップグレードすることで解決しました:classpath 'com.android.tools.build:gradle:3.3.1'(以前はバージョン3.2でした。


2

上記のEddiの説明に従って解決しました。

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

2

競合する依存関係を実装からAPIに切り替えるとうまくいきます。ここに違いを説明するmindorksによる良い記事があります。

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

私の場合、2つの異なるモジュールに以下の実装の2つの異なるバージョンがあったので、両方の実装をバージョン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
これは、ライブラリがあなたから少し逃げる原因となる可能性があるため、正確にはベストプラクティスではありません。例 新しいバージョンでの処理方法が変わり、突然コードが機能しなくなります。最新バージョンを使用するように努める必要がありますが、不要なクラッシュやバグを防ぐために、最初にバージョン番号をテストしてから手動でバージョン番号を設定する必要があります。
ジョナスターリング2018年

1
良い習慣ではありません。@JonahStarlingの発言に加えて、オフライン機能をオフにすると、Gradleビルドのパフォーマンスにも影響します。
Ankit Batra 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.