Die Android-Abhängigkeit hat unterschiedliche Versionen für die Kompilierung und Laufzeit

105

Nach dem Update von Android Studio von Canary 3 auf Canary 4 wird beim Erstellen der folgende Fehler ausgegeben.

Die Android-Abhängigkeit 'com.android.support:support-support-v4' hat eine andere Version für den Klassenpfad compile (25.2.0) und runtime (26.0.0-beta2). Sie sollten dieselbe Version manuell über DependencyResolution festlegen.

Ich habe während des gesamten Projekts eine vollständige Suche durchgeführt und die Version 25.1.0wird nicht verwendet.

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'

}

Hinweis: Das Projekt in Canary 3 lief einwandfrei

DroidLearner
quelle
Ich hatte auch das gleiche Problem, da ich zwei Module in meiner App verwende. Stellen Sie daher sicher, dass Sie für alle Gradle-Dateien denselben Versionscode verwenden.
Nadeem Bhat

Antworten:

136

Verwenden Sie diesen Code in Ihrem Buildscript (build.gradle root):

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"
        }
     }
  }
}
user3908686
quelle
8
Es hat bei mir funktioniert, denken Sie daran, details.useVersion in eine Versionsnummer zu ändern. Wenn Sie nur kopieren und einfügen, schlägt dies fehl
John Starr Dewar
2
Das Beste, arbeitet mit RN 0,55, Gradle 4.1, Build Gradle Tools 3.0.1
Nerius Jok
1
Es !details.requested.name.contains('multidex')hat mir wirklich geholfen, das einzubeziehen.
Jonah Starling
2
Ich habe es versucht, aber es hat nur für den Konflikt com.android.support funktioniert. Für den Konflikt com.google.firebase: firebase-analysis hat es nicht funktioniert. Das 'enthält' scheint zu vielen Paketen zu entsprechen. Ich habe stattdessen die einfachere Lösung in diesem Beitrag für alle Konflikte verwendet und es hat perfekt funktioniert.
Jacob Joel
2
@ user3908686 hat das Problem gelöst, aber bitte erklären Sie, warum wir dies hinzufügen müssen?
ArgaPK
81

Ich hatte den gleichen Fehler, was mein Problem löste. In meiner Bibliothek verwende ich anstelle von Kompilieren oder Implementieren "api". Also am Ende meine Abhängigkeiten:

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'
}

Weitere Informationen zu "API" und "Implementierung" finden Sie unter diesem Link https://stackoverflow.com/a/44493379/3479489

Yayo Arellano
quelle
36
Alle Android Studio empfiehlt die Verwendung der Implementierung. Und diese ungewöhnliche Lösung funktioniert. Google-Ingenieure in Android-Studios brauchen eine Lektion, um von der Welt zu lernen. Was für ein frustrierendes Werkzeug
Siddharth
3
es löst das Problem nicht, die Meldung lautet: "Android-Abhängigkeit '...............' hat eine andere Version für die Kompilierung"
Jorgesys
Arbeite für mich. Vielen Dank
Duan Nguyen
@KeithLoughnane Dies ist keine schlechte Praxis, ist die richtige Art und Weise und die Art und Weise, wie die Dokumentation empfiehlt
Yayo Arellano
1
Die Implementierung von @YayoArellano wird empfohlen, wenn die API mit Bedacht verwendet wird, wo dies unbedingt erforderlich ist. Dies ist alles an die Wand werfen und sehen, was Sticks programmieren. Einige von ihnen benötigen möglicherweise API, aber nicht alle. Sie belichten viel zu viel.
Keith Loughnane
22

Sie sollten in der Lage sein, genau zu sehen, welche Abhängigkeit in der ungeraden Version als transitive Abhängigkeit abgerufen wird, indem Sie den richtigen gradle -q dependenciesBefehl für Ihr Projekt ausführen, wie hier beschrieben:

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

Sobald Sie herausgefunden haben, was es in sich zieht, können Sie dieser spezifischen Abhängigkeit in Ihrer Gradle-Datei einen Ausschluss hinzufügen, der Folgendes umfasst:

implementation("XXXXX") {
    exclude group: 'com.android.support', module: 'support-compat'
}
jdonmoyer
quelle
Hallo, ich habe den Befehl gradle dependency ausgeführt und veröffentliche die Screenshot-URL hier, imgur.com/dL35BaN. Ich verwende Firebase nie in meinem Projekt. Diese Zeile in gcm hinzugefügt, hat aber nicht funktioniert
DroidLearner
@DroidLearner Möglicherweise fehlt mir etwas, aber in dem von Ihnen geposteten Screenshot wird kein Verweis auf com.android.support:support-compat angezeigt. Außerdem enthält dieser Screenshot eine Warnung, die auf eine Kompilierungskonfiguration verweist, die in Ihrer Gradle-Datei im OP nicht vorhanden ist. Es ist wahrscheinlich, dass es vom: Core-Submodul kommt. Können Sie von dort aus die relevanten Gradle-Informationen veröffentlichen?
jdonmoyer
Hallo, hier werden die gesamten Gradle-Dateien mit dem Abhängigkeitsbaum veröffentlicht. App-Gradle-Datei -> gist.github.com/anonymous/93affc0d75eb96b59f9fde51332b9716 Core-Gradle-Datei -> gist.github.com/anonymous/5c85031f26ff766109061ab1f00b833d Abhängigkeitsbaum -> g. com / anonym / 71dd33b6fa4dc63dd357889e8aff01ee Hoffe, das hilft.
DroidLearner
1
Es sieht so aus, als würde die ältere Version der Bibliothek von Firebase abgerufen, was wiederum eine transitive Abhängigkeit von gms ist. Sie können dies wahrscheinlich zum Laufen bringen, indem Sie vor jeder anderen Abhängigkeit Folgendes hinzufügen: Implementierung 'com.android.support:support-v4:26.0.0-beta2'. Das langfristige Deaktivieren von transitiven Abhängigkeiten zugunsten der expliziten Verwendung oder Verwendung einer ResolutionStrategy ( docs.gradle.org/current/dsl/… ) ist wahrscheinlich ein besserer Ansatz.
jdonmoyer
1
Vielen Dank. Irgendwie gelang es, die transitive Abhängigkeit zu beheben. Gradle Build war erfolgreich. Zur Laufzeit werden Fehler bei allen Bibliotheksklassen angezeigt. Fehler: Paket retrofit2 existiert nicht Fehler: Paket android.support.v7.app existiert nicht Fehler: Paket com.google.gson existiert nicht. Zum Zeitpunkt der Kompilierung wurden keine Fehler angezeigt.
DroidLearner
16

Nach viel Zeit und Hilfe von einem Freund, der viel mehr als ich über Android weiß: 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"
        // }
    }

und Abhängigkeiten

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
}

in build.gradle

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

in gradle.properties

android.useDeprecatedNdk=true
android.enableAapt2=false
org.gradle.jvmargs=-Xmx4608M
Stefano Solinas - Obsidianart
quelle
4
resolutionStrategy.forcewar das einzige, was für mich funktioniert hat. Vielen Dank!
Orion Edwards
7

Die Antwort für mich war, dies auch zu meiner build.gradleDatei hinzuzufügen :

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

In meinem Fall war es notwendig, die Auflösungsstrategie in einen configurations.all { .. }Block einzuschließen . Ich habe den configurations.allBlock direkt in meine app/build.gradleDatei eingefügt (dh configurations.allin nichts anderem verschachtelt)

Dacre Denny
quelle
5

Das hat bei mir funktioniert:

Fügen Sie app/build.gradleim Abschnitt "Abhängigkeiten" die folgende Zeile hinzu :

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

oder :27.1.1in meinem Fall

ALEXANDER LOZANO
quelle
4

Fügen Sie diesen Code in Ihre build.gradle-Datei auf Projektebene ein.

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"
            }
        }
    }
}

Beispielcode :

// 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"
            }
        }
    }
}
Dileep krishnan
quelle
3

Wenn jemand dieses Abhängigkeitsproblem im Jahr 2019 hat, aktualisieren Sie Android Studio auf 3.4 oder höher

Atul Vasudev A.
quelle
3

Ich habe es gelöst, indem ich meine Gradle-Abhängigkeit in der Datei android / build.gradle aktualisiert habe: Klassenpfad 'com.android.tools.build:gradle:3.3.1' (ich war zuvor in Version 3.2.

Ajani Eniola
quelle
2

Ich habe es gelöst, indem ich dem folgte, was Eddi oben erwähnt hat:

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

Das Wechseln meiner widersprüchlichen Abhängigkeiten von der Implementierung zur API reicht aus. Hier ist ein guter Artikel von mindorks, der den Unterschied erklärt.

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

Bearbeiten:

Hier sind auch meine Abhängigkeitsauflösungen

 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"
                }
            }
        }
    }
ich bin
quelle
2

Sehen Sie in Ihren Bibliotheksprojekten, dass die Versionen compileSdkVersion und targetSdkVersion auf dem gleichen Niveau wie Ihre Anwendung sind

android {
    compileSdkVersion 28

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

Machen Sie auch alle Abhängigkeiten auf die gleiche Ebene

Ali Imran
quelle
1

Ich kommentiere aus, dass //api 'com.google.android.gms:play-services-ads:15.0.1'es nach der Synchronisierung bei mir funktioniert hat

Fredrick Reuben
quelle
1

Fügen Sie diese Zeilen einfach in Ihre build.gradle-Datei ein

ResolutionStrategy.force "com.android.support:support-media-compat:26.0.0-beta2"

ResolutionStrategy.force "com.android.support:support-v4:26.0.0-beta2"

Tushar
quelle
0

In meinem Fall hatte ich zwei verschiedene Versionen der folgenden Implementierung in zwei verschiedenen Modulen. Also habe ich beide Implementierungen in Versionen geändert, dh: 6.0.2 und es hat funktioniert. Möglicherweise müssen Sie auch eine Abhängigkeitsauflösung schreiben, um die akzeptierte Antwort zu sehen.

App-Modul

implementation 'com.karumi:dexter:5.0.0'

Commons-Modul

implementation 'com.karumi:dexter:6.0.2'
Divyanshu Kumar
quelle
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
    }

füge dies zu gradle (project) inside hinzu allprojects

Farido mastr
quelle
-7

Ersetzen Sie eine fest codierte Version durch + Beispiel:

implementation 'com.google.android.gms:play-services-base:+'
implementation 'com.google.android.gms:play-services-maps:+'
Sarmad Shah
quelle
7
Nicht gerade die beste Vorgehensweise, da dies dazu führen kann, dass eine Bibliothek vor Ihnen davonläuft. Ex. Sie ändern die Art und Weise, wie Dinge in einer neuen Version erledigt werden, und plötzlich funktioniert Ihr Code nicht mehr. Während Sie sich bemühen sollten, die neueste Version zu verwenden, sollten Sie die Versionsnummer nach dem ersten Testen manuell festlegen, um unerwünschte Abstürze und Fehler zu vermeiden.
Jonah Starling
1
Keine gute Praxis. Zusätzlich zu den Aussagen von @JonahStarling wirkt sich dies auch auf die Leistung des Gradle-Builds aus, wenn die Offline-Funktion deaktiviert ist.
Ankit Batra