2017-03-09 2 views
5

der KatalysatorWie Verwenden von Gradle-Abhängigkeitsbaum, um Android-Support-Bibliotheksversionskonflikt aufzulösen?

Ich habe ein Upgrade Android Studio 2.3 und Gradle Plugin 3.3

das ursprüngliche Problem

Nach dem Gradle Plugin 3.3 aktualisieren, ich den Fehler „Fehler erhalten: Die SDK Build Tools-Version (23.0.3) ist zu niedrig für das Projekt ': mymodulename'. Erforderlich ist mindestens 25.0.0 "

Ich habe versucht, buildToolsVersion auf 25.0.2 zu justieren und compileSdkVers Ion zu 25, zusammen mit allen Abhängigkeiten von com.android.support (da ihre Hauptversion mit compileSdkVersion übereinstimmen muss). Diese Anpassung löste dieses Problem, aber dann wurde mir klar, dass meine App Nougat noch nicht unterstützt, also reduzierte ich die compileSdkVersion auf meine targetSdkVersion von 23. Die Fehlermeldung über zu niedrige Build-Tools war immer noch weg, also dachte ich, ich wäre im Klartext .

der erste Abhängigkeitsfehler

Nach compileSdkVersion bis zu 23 Klopfen habe ich versucht, neu zu erstellen, und sah mehrere Fehler ähnlich wie „Fehler: (3) Fehler beim Abrufen der Eltern für die Position: Keine Ressource, dass die angegebenen Spiele name 'android: TextAppearance.Material.Widget.Button.Borderless.Colored' ". Ich erkennen, dass ich vergessen hatte meine com.android.support Abhängigkeiten zu ändern, so dass ihre Hauptversion das untere compileSdkVersion wieder angepasst, so dass ich stieß sie auf 23.3.0 unten

den zweiten Abhängigkeitsfehler

Nach Bei der Auflösung des ersten Abhängigkeitsfehlers konnte ich meine App erneut kompilieren und ausführen. Allerdings gab es immer noch einen roten Kringel unter meiner ersten com.android.support-Abhängigkeit, mit der Fehlermeldung "Alle com.android.support-Bibliotheken müssen genau die gleiche Versionsspezifikation verwenden (das Mischen von Versionen kann zu Laufzeitabstürzen führen). Gefundene Versionen 24.0 .0, 23.3.0 Beispiele sind com.android.support:support-v4:24.0.0 und com.android.support:animated-vector-drawable:23.3.0 "

Nichts in meinem build.gradle speziell 24.0.0 verweist, siehe:

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' 

der Abhängigkeitsbaum

um f Wenn ich herausfinden möchte, woher die 24.0.0-Abhängigkeit kam, habe ich eine Abhängigkeitsbaumstruktur mit './gradlew -q Abhängigkeiten mymodulename: Abhängigkeiten - Konfiguration kompilieren' erstellt. Die Ausgabe lautet:

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) 

die Fragen

  1. Was bedeutet die Abhängigkeitsbaum Syntax 'lib-Version -> verschiedene lib Version' bedeuten? Genauer gesagt, wenn der Baum "com.android.support:support-v4:23.3.0 -> 24.0.0" sagt, was bedeutet das?

  2. Wenn es implizite Anforderungen für com.android.support Version 24.xx Bibliotheken in einigen meiner anderen Abhängigkeiten gibt (siehe com.google.android.gms: play-services-basement: 10.0.1 abhängig von com. android.support:support-v4:24.0.0), warum hat das nicht gebaut.Gradle Throw-Fehler vor dem Android Studio, dem Gradle-Plugin und dem buildToolsVersion-Update, die bereits erwähnt wurden?

  3. Wie kann ich sicherstellen, dass alle meine Abhängigkeiten mit compileSdkVersion 23 kompatibel sind?

+0

Was passiert, wenn Sie mit 25 kompilieren, aber eine Unterstützungsbibliothek der Version 23 verwenden? –

+1

Sie sollten den Abhängigkeitsbaum als Text veröffentlichen. Markieren Sie es und drücken Sie Strg-K, um die Formatierung beizubehalten. Diese Tastenkombination fügt die für einen Codeblock erforderlichen Leerzeichen hinzu. –

+2

Beachten Sie, dass 'compileSdkVersion' das Verhalten Ihrer App nicht ändert - das wäre' targetSdkVersion', wie in [diesem Blogpost] erläutert (https://medium.com/google-developers/picking-your-compilesdkversion- minsdkversion-targetsdkversion-a098a0341ebd). Sie sollten immer mit der neuesten Version von Android kompilieren, auch wenn Sie nicht darauf abzielen. – ianhanniballake

Antwort

6

Specifically, when the tree says "com.android.support:support-v4:23.3.0 -> 24.0.0", what does it mean?

Es bedeutet, dass eine Bibliothek com.android.support:support-v4:23.3.0 als verschachtelte dipendency hat, aber sie sind nur eine andere und höhere Version der gleichen Abhängigkeiten, in diesem Fall com.android.support:support-v4:24.0.0 verwenden.
Mit anderen Worten wird das Projekt die Verwendung 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?

Da Sie die Gradle Plugin 3.3 aktualisiert haben, die diese Art von Kontrolle hat.

How can I make sure all my dependencies are compatible with compileSdkVersion 23?

Es ist ziemlich schwierig zu haben.
Die einzige Möglichkeit besteht darin, alle Abhängigkeiten zu überprüfen, aber ich schlage vor, Sie verwenden:

compileSdkVersion 25 
targetSdkVersion 23 

Im Allgemeinen ist es eine gute Idee ist die neueste Version von buildToolsVersion in jedem Fall verwendet werden, unabhängig von der Version von Support-Bibliotheken verwendet .

Darüber hinaus. Es wird dringend empfohlen, dass Sie immer mit dem neuesten SDK kompilieren. Es bedeutet, dass Sie heute compileSdkVersion 25 verwenden sollten.

+0

okay, sehr interessant. Ich spielte mit meinen anderen Abhängigkeiten herum und es scheint, dass die Einträge com.google.android.gms und com.google.firebase diejenigen waren, die eine 24.x.x-Support-Bibliotheksversion mitbrachten; Das Löschen der Einträge com.google.android.gms und com.google.firebase auf Version 9.0.0 ermöglichte die Verwendung von support lib 23.x.x und compileSdkVersion 23 ohne eine Fehlerbeschreibung. – CCJ

+0

in Bezug auf Ihren Kommentar über das Kompilieren mit dem neuesten SDK, riskieren Sie nicht die versehentliche Verwendung neuer APIs, die in meiner Ziel-API-Ebene nicht verfügbar sind? Lint könnte sie abfangen, aber es würde keine Kompilierungsfehler geben und ich bin mir ziemlich sicher, dass es Laufzeitfehler geben würde ... Was sind die Vorteile, wenn Sie eine compileSdkVersion höher als Ihre targetSdkVersion verwenden? Haben Sie eine offizielle Referenz, in der empfohlen wird, dass Entwickler immer mit der neuesten SDK-Version kompilieren? – CCJ

+0

@CCJ Überprüfen Sie diesen Link: https://medium.com/google-developers/picking-your-compilesdkversion-minsdkversion-targetsdkversion-a098a0341ebd#.23i9y3s6f. Der Autor ist ein Android-Entwickler Advocate bei Google: Überprüfen Sie insbesondere den Teil: "Es sollte betont werden, dass das Ändern der CompileSdkVersion Laufzeitverhalten nicht ändert. Während CompilerSdkVersion neue Compiler Warnungen/Fehler vorhanden sein kann, ist Ihre CompileSdkVersion nicht enthalten in deinem APK: es wird nur zur Kompilierzeit verwendet " –

Verwandte Themen