Android Gradle Plugin 7.0.0 (Juli 2021)
Das Android Gradle-Plug-in 7.0.0 ist ein wichtiger Release mit einer Vielzahl neuer Funktionen und Verbesserungen.
7.0.1 (August 2021)
Dieses kleinere Update enthält verschiedene Fehlerkorrekturen. Eine Liste der wichtigsten Fehlerkorrekturen finden Sie im entsprechenden Beitrag im Blog „Release Updates“.
Kompatibilität
Mindestversion | Standardversio | Hinweise | |
---|---|---|---|
Gradle | 7.0.2 | 7.0.2 | Weitere Informationen finden Sie unter Gradle aktualisieren. |
SDK-Build-Tools | 30.0.2 | 30.0.2 | Installieren oder konfigurieren Sie die SDK-Build-Tools. |
NDK | – | 21.4.7075529 | Installieren oder konfigurieren Sie eine andere Version des NDK. |
JDK | 11 | 11 | Weitere Informationen finden Sie unter JDK-Version festlegen. |
JDK 11 für die Ausführung von AGP 7.0 erforderlich
Wenn Sie das Android Gradle-Plug-in 7.0 zum Erstellen Ihrer App verwenden, ist jetzt JDK 11 erforderlich, um Gradle auszuführen. Android Studio Arctic Fox enthält JDK 11 und konfiguriert Gradle so, dass es standardmäßig verwendet wird. Das bedeutet, dass die meisten Android Studio-Nutzer keine Konfigurationsänderungen an ihren Projekten vornehmen müssen.
Wenn Sie die JDK-Version festlegen müssen, die von AGP in Android Studio verwendet wird, müssen Sie JDK 11 oder höher verwenden.
Wenn Sie AGP unabhängig von Android Studio verwenden, aktualisieren Sie die JDK-Version, indem Sie die Umgebungsvariable JAVA_HOME oder die -Dorg.gradle.java.home
-Befehlszeilenoption auf das Installationsverzeichnis von JDK 11 festlegen.
Der SDK Manager und der AVD Manager im eingestellten SDK Tools-Paket funktionieren nicht mit JDK 11. Wenn Sie den SDK-Manager und den AVD-Manager weiterhin mit AGP 7.0 und höher verwenden möchten, müssen Sie zu den neuen Versionen der Tools im aktuellen Paket mit Android SDK-Befehlszeilentools wechseln.
Variant API stabil
Die neue Variant API ist jetzt stabil. Weitere Informationen zu den neuen Schnittstellen finden Sie im Paket com.android.build.api.variant und Beispiele im GitHub-Projekt gradle-recipes. Im Rahmen der neuen Variant API stellen wir über die Benutzeroberfläche Artefakte eine Reihe von Zwischendateien bereit, die als Artefakte bezeichnet werden. Diese Artefakte, wie das zusammengeführte Manifest, können mithilfe von Plug-ins und Code von Drittanbietern sicher abgerufen und angepasst werden.
Wir werden die Variant API weiter ausbauen, indem wir neue Funktionen hinzufügen und die Anzahl der Zwischenartefakte erhöhen, die wir für die Anpassung zur Verfügung stellen.
Verhaltensänderungen für Lint
In diesem Abschnitt werden mehrere Änderungen am Lint-Verhalten im Android Gradle-Plug-in 7.0.0 beschrieben.
Verbessertes Lint für Bibliotheksabhängigkeiten
Das Ausführen von lint mit checkDependencies = true
ist jetzt schneller als zuvor. Für Android-Projekte, die aus einer App mit Bibliotheksabhängigkeiten bestehen, wird empfohlen, checkDependencies
wie unten gezeigt auf true
festzulegen und lint über ./gradlew :app:lint
auszuführen. Dadurch werden alle Abhängigkeitsmodule parallel analysiert und ein einzelner Bericht mit Problemen aus der App und allen zugehörigen Abhängigkeiten erstellt.
Groovy
// build.gradle
android {
...
lintOptions {
checkDependencies true
}
}
Kotlin
// build.gradle.kts
android {
...
lint {
isCheckDependencies = true
}
}
Lint-Aufgaben können jetzt auf AKTUELL gesetzt werden
Wenn sich die Quellen und Ressourcen eines Moduls nicht geändert haben, muss die Lint-Analyse für das Modul nicht noch einmal ausgeführt werden. In diesem Fall wird in der Gradle-Ausgabe für die Ausführung der Aufgabe „AKTUELL“ angezeigt. Durch diese Änderung müssen bei der Ausführung von lint für ein Anwendungsmodul mit checkDependencies = true
nur die Module analysiert werden, die sich geändert haben. Dadurch kann Lint noch schneller ausgeführt werden.
Die Aufgabe für den Lint-Bericht muss auch nicht ausgeführt werden, wenn sich die Eingaben nicht geändert haben. Ein ähnliches bekanntes Problem ist, dass keine Lint-Textausgabe auf stdout ausgegeben wird, wenn die Lint-Aufgabe AKTUELL ist (Problem #191897708).
Lint für dynamische Funktionsmodule ausführen
AGP unterstützt das Ausführen von lint aus dynamischen Funktionsmodulen nicht mehr.
Wenn Sie lint über das entsprechende Anwendungsmodul ausführen, wird lint auch auf den Modulen mit dynamischen Funktionen ausgeführt und alle Probleme werden in den lint-Bericht der App aufgenommen. Ein ähnliches bekanntes Problem ist, dass beim Ausführen von lint mit checkDependencies = true
aus einem App-Modul die Abhängigkeiten von Bibliotheken für dynamische Funktionen nur dann geprüft werden, wenn sie auch App-Abhängigkeiten sind (Problem #191977888).
Lint nur für die Standardvariante ausführen
Wenn Sie ./gradlew :app:lint
ausführen, wird jetzt nur die Standardvariante geprüft. In früheren Versionen von AGP wurde lint für alle Varianten ausgeführt.
Warnungen zu fehlenden Klassen im R8-Schrumpfer
R8 verarbeitet fehlende Klassen und die Option -dontwarn
genauer und konsistenter.
Daher sollten Sie die Warnungen zu fehlenden Klassen bewerten, die von R8 ausgegeben wurden.
Wenn R8 auf eine Klassenreferenz stößt, die nicht in Ihrer App oder einer ihrer Abhängigkeiten definiert ist, wird eine Warnung ausgegeben, die in der Build-Ausgabe erscheint. Beispiel:
R8: Missing class: java.lang.instrument.ClassFileTransformer
Diese Warnung bedeutet, dass die Klassendefinition java.lang.instrument.ClassFileTransformer
bei der Analyse des Codes Ihrer App nicht gefunden werden konnte. Normalerweise bedeutet dies, dass ein Fehler vorliegt. Es kann jedoch sein, dass Sie diese Warnung ignorieren möchten. Zwei häufige Gründe, die Warnung zu ignorieren, sind:
-
Bibliotheken, die auf die JVM ausgerichtet sind und die fehlende Klasse enthalten, sind vom Typ „JVM-Bibliothek“ (wie im Beispiel oben).
-
Eine Ihrer Abhängigkeiten verwendet eine API, die nur zur Kompilierungszeit verwendet werden kann.
Sie können eine Warnung zu fehlenden Klassen ignorieren, indem Sie der Datei proguard-rules.pro
eine -dontwarn
-Regel hinzufügen. Beispiel:
-dontwarn java.lang.instrument.ClassFileTransformer
Zur besseren Übersicht generiert AGP eine Datei mit allen potenziell fehlenden Regeln und schreibt sie in einen Dateipfad wie app/build/outputs/mapping/release/missing_rules.txt
. Fügen Sie die Regeln der Datei proguard-rules.pro
hinzu, um Warnungen zu ignorieren.
In AGP 7.0 werden Nachrichten zu fehlenden Klassen als Warnungen angezeigt. Sie können sie in Fehler umwandeln, indem Sie android.r8.failOnMissingClasses = true
in gradle.properties
festlegen. In AGP 8.0 werden diese Warnungen zu Fehlern, die den Build verhindern. Sie können das Verhalten von AGP 7.0 beibehalten, indem Sie der Datei proguard-rules.pro
die Option -ignorewarnings
hinzufügen. Wir raten jedoch davon ab.
Build-Cache des Android-Gradle-Plug-ins entfernt
Der AGP-Build-Cache wurde in AGP 4.1 entfernt. Der AGP-Build-Cache wurde in AGP 2.3 als Ergänzung zum Gradle-Build-Cache eingeführt. In AGP 4.1 wurde er vollständig durch den Gradle-Build-Cache ersetzt. Diese Änderung hat keine Auswirkungen auf die Buildzeit.
In AGP 7.0 wurden das Attribut android.enableBuildCache
, das Attribut android.buildCacheDir
und die Aufgabe cleanBuildCache
entfernt.
Java 11-Quellcode in Ihrem Projekt verwenden
Sie können jetzt bis zu Java 11-Quellcode im Projekt Ihrer App kompilieren und so neuere Sprachfunktionen wie private Schnittstellenmethoden, den Rauteoperator für anonyme Klassen und die Syntax lokaler Variablen für Lambda-Parameter verwenden.
Wenn Sie diese Funktion aktivieren möchten, legen Sie für compileOptions
die gewünschte Java-Version und für compileSdkVersion
den Wert 30 oder höher fest:
// build.gradle
android {
compileSdkVersion 30
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
// For Kotlin projects
kotlinOptions {
jvmTarget = "11"
}
}
// build.gradle.kts
android {
compileSdkVersion(30)
compileOptions {
sourceCompatibility(JavaVersion.VERSION_11)
targetCompatibility(JavaVersion.VERSION_11)
}
kotlinOptions {
jvmTarget = "11"
}
}
Abhängigkeitskonfigurationen entfernt
In AGP 7.0 wurden die folgenden Konfigurationen (oder Abhängigkeitsbereiche) entfernt:
-
compile
Je nach Anwendungsfall wurde dies durchapi
oderimplementation
ersetzt.
Gilt auch für Varianten vom Typ *Compile, z. B.debugCompile
. -
provided
Dieser wurde durchcompileOnly
ersetzt.
Gilt auch für *von Ihnen bereitgestellte Varianten, z. B.:releaseProvided
. -
apk
Dieser wurde durchruntimeOnly
ersetzt. -
publish
Dieser wurde durchruntimeOnly
ersetzt.
In den meisten Fällen migriert der AGP-Upgrade-Assistent Ihr Projekt automatisch zu den neuen Konfigurationen.
Änderung des Klassenpfads beim Kompilieren mit dem Android Gradle-Plug-in
Wenn Sie mit dem Android Gradle-Plug-in kompilieren, ändert sich möglicherweise der Compile-Classpath. Da AGP jetzt intern api/implementation
-Konfigurationen verwendet, werden einige Artefakte möglicherweise aus Ihrem Kompilierungs-Klassenpfad entfernt. Wenn Sie zur Kompilierungszeit von einer AGP-Abhängigkeit abhängig sind, müssen Sie sie als explizite Abhängigkeit hinzufügen.
Das Hinzufügen nativer Bibliotheken in einem Java-Ressourcenverzeichnis wird nicht unterstützt.
Bisher konnten Sie eine native Bibliothek in einem Java-Ressourcenverzeichnis hinzufügen und den Ordner mit android.sourceSets.main.resources.srcDirs
registrieren, damit die native Bibliothek extrahiert und dem endgültigen APK hinzugefügt wurde. Ab AGP 7.0 wird dies nicht mehr unterstützt und native Bibliotheken in einem Java-Ressourcenordner werden ignoriert. Verwenden Sie stattdessen die DSL-Methode android.sourceSets.main.jniLibs.srcDirs
, die für native Bibliotheken vorgesehen ist. Weitere Informationen finden Sie unter Quellsätze konfigurieren.
Bekannte Probleme
In diesem Abschnitt werden bekannte Probleme im Android Gradle-Plug-in 7.0.0 beschrieben.
Inkompatibilität mit dem Kotlin Multiplatform-Plug-in 1.4.x
Das Android Gradle-Plug-in 7.0.0 ist mit dem Kotlin-Multiplattform-Plug-in 1.5.0 und höher kompatibel. Projekte, die die Kotlin-Multiplattformunterstützung verwenden, müssen auf Kotlin 1.5.0 aktualisiert werden, um das Android Gradle-Plug-in 7.0.0 verwenden zu können. Als Behelfslösung können Sie das Android Gradle-Plug-in auf 4.2.x downgraden. Wir raten davon jedoch ab.
Weitere Informationen finden Sie unter KT-43944.
Fehlende Lint-Ausgabe
Wenn die Lint-Aufgabe auf dem neuesten Stand ist, wird keine Lint-Textausgabe an stdout ausgegeben (Problem #191897708). Weitere Informationen finden Sie unter Änderungen am Verhalten von lint. Dieses Problem wird im Android Gradle-Plug-in 7.1 behoben.
Nicht alle Abhängigkeiten von Bibliotheken für dynamische Funktionen werden mit Lint geprüft
Wenn Sie „lint“ mit checkDependencies = true
aus einem App-Modul ausführen, werden die Abhängigkeiten von Bibliotheken für dynamische Funktionen nur dann geprüft, wenn sie auch App-Abhängigkeiten sind (Problem 191977888).
Als Behelfslösung kann die Lint-Aufgabe auf diesen Bibliotheken ausgeführt werden. Weitere Informationen finden Sie unter Änderungen am Verhalten von Lint.