Android-Gradle-Plug-in 7.0.0 (Juli 2021)

Das Android-Gradle-Plug-in 7.0.0 ist eine Hauptversion mit einer Vielzahl neuer Funktionen und Verbesserungen.

7.0.1 (August 2021)

Dieses kleinere Update enthält verschiedene Fehlerkorrekturen. Eine Liste wichtiger Fehlerkorrekturen finden Sie im entsprechenden Beitrag im Blog mit Release-Updates.

Kompatibilität

Mindestversion Standardversio
Logo: Gradle 7.0.2 7.0.2
SDK-Build-Tools 30.0.2 30.0.2
Logo: NDK 21.4.7075529
JDK 11 11

JDK 11 zur Ausführung von AGP 7.0 erforderlich

Wenn Sie Ihre App mit dem Android-Gradle-Plug-in 7.0 erstellen, ist zum Ausführen von Gradle jetzt JDK 11 erforderlich. Android Studio Arctic Fox bündelt 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 manuell festlegen möchten, 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. Legen Sie dazu die Umgebungsvariable JAVA_HOME oder die Befehlszeilenoption -Dorg.gradle.java.home in Ihrem Installationsverzeichnis von JDK 11 fest.

Der SDK Manager und der AVD Manager im verworfenen SDK Tools-Paket funktionieren nicht mit JDK 11. Wenn Sie SDK Manager und AVD Manager weiterhin mit AGP 7.0 und höher verwenden möchten, müssen Sie zu den neuen Versionen der Tools im aktuellen Android SDK-Befehlszeilentools-Paket wechseln.

Variant API – stabil

Die neue Variant API ist jetzt stabil. Sehen Sie sich die neuen Schnittstellen im Paket com.android.build.api.variant und Beispiele im GitHub-Projekt gradle-recipes an. Im Rahmen der neuen Variant API stellen wir über die Artifacts-Oberfläche eine Reihe von Zwischendateien zur Verfügung, die als Artefakte bezeichnet werden. Diese Artefakte wie das zusammengeführte Manifest können sicher abgerufen und mithilfe von Drittanbieter-Plug-ins und Code angepasst werden.

Wir erweitern die Variant API um neue Funktionen und erweitern die Anzahl der Zwischenartefakte, die wir für die Anpassung zur Verfügung stellen.

Verhaltensänderungen für Lint

In diesem Abschnitt werden mehrere Änderungen des Lint-Verhaltens im Android-Gradle-Plug-in 7.0.0 beschrieben.

Verbessertes Lint für Bibliotheksabhängigkeiten

Lint mit checkDependencies = true kann jetzt schneller als zuvor ausgeführt werden. Für Android-Projekte, die aus einer Anwendung mit Bibliotheksabhängigkeiten bestehen, wird empfohlen, checkDependencies auf true festzulegen (siehe unten) und Lint über ./gradlew :app:lint auszuführen. Dadurch werden alle Abhängigkeitsmodule parallel analysiert und es wird ein einzelner Bericht erstellt, der Probleme mit der Anwendung und allen ihren Abhängigkeiten enthält.

Cool

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

Lint-Aufgaben können jetzt AKTUALISIERT sein

Wenn sich die Quellen und Ressourcen eines Moduls nicht geändert haben, muss die Lint-Analyseaufgabe für das Modul nicht noch einmal ausgeführt werden. In diesem Fall wird die Ausführung der Aufgabe in der Gradle-Ausgabe als "UP-TO-DATE" angezeigt. Nach dieser Änderung müssen beim Ausführen von Lint für ein Anwendungsmodul mit checkDependencies = true nur Module mit geänderten Modulen ihre Analyse ausführen. Dadurch kann Lint noch schneller ausgeführt werden.

Die Lint-Berichtsaufgabe muss auch nicht ausgeführt werden, wenn sich die Eingaben nicht geändert haben. Ein ähnliches bekanntes Problem besteht darin, dass keine Lint-Textausgabe an stdout ausgegeben wird, wenn die Lint-Aufgabe AKTUALISIERT ist (Problem 191897708).

Lint für Module mit dynamischen Funktionen ausführen

AGP unterstützt die Ausführung von Lint aus Modulen mit dynamischen Funktionen nicht mehr. Wenn Sie Lint im entsprechenden Anwendungsmodul ausführen, wird Lint für die Module mit dynamischen Funktionen ausgeführt und alle Probleme in den Lint-Bericht der Anwendung aufgenommen. Ein ähnliches bekanntes Problem besteht darin, dass beim Ausführen von Lint mit checkDependencies = true über ein Anwendungsmodul die Abhängigkeiten der Bibliothek mit dynamischen Funktionen nur geprüft werden, wenn es sich auch um Anwendungsabhängigkeiten handelt (Problem 191977888).

Lint nur für Standardvariante ausführen

Bei Ausführung von ./gradlew :app:lint wird Lint jetzt nur für die Standardvariante ausgeführt. In früheren Versionen von AGP wurde Lint für alle Varianten ausgeführt.

Fehlende Klassenwarnungen im R8-Schrumpfer

R8 verarbeitet fehlende Klassen und die Option -dontwarn präziser und konsistenter. Daher sollten Sie damit beginnen, die von R8 ausgegebenen fehlenden Klassenwarnungen auszuwerten.

Wenn R8 auf eine Klassenreferenz stößt, die nicht in Ihrer Anwendung oder einer ihrer Abhängigkeiten definiert ist, wird eine Warnung in der Build-Ausgabe ausgegeben. Beispiel:

R8: Missing class: java.lang.instrument.ClassFileTransformer

Diese Warnung bedeutet, dass die Klassendefinition java.lang.instrument.ClassFileTransformer beim Analysieren des Codes Ihrer Anwendung nicht gefunden wurde. Dies bedeutet normalerweise, dass ein Fehler vorliegt. Es ist jedoch möglich, dass Sie diese Warnung ignorieren möchten. Zwei häufige Gründe für das Ignorieren der Warnung sind:

  1. Bibliotheken, die auf die JVM und die fehlende Klasse ausgerichtet sind, haben den Typ der JVM-Bibliothek (wie im obigen Beispiel).

  2. Eine Ihrer Abhängigkeiten verwendet eine API, die nur zur Kompilierungszeit benötigt wird.

Sie können eine Warnung wegen fehlender Klasse ignorieren, indem Sie der Datei proguard-rules.pro eine -dontwarn-Regel hinzufügen. Beispiel:

-dontwarn java.lang.instrument.ClassFileTransformer

Der Einfachheit halber generiert AGP eine Datei mit allen möglicherweise fehlenden Regeln und schreibt sie in einen Dateipfad wie den folgenden: app/build/outputs/mapping/release/missing_rules.txt. Fügen Sie der Datei proguard-rules.pro Regeln hinzu, um Warnungen zu ignorieren.

In AGP 7.0 werden fehlende Klassennachrichten als Warnungen angezeigt. Sie können diese in Fehler umwandeln, indem Sie android.r8.failOnMissingClasses = true in gradle.properties festlegen. In AGP 8.0 werden diese Warnungen zu Fehlern, die Ihren Build beschädigen. Es ist möglich, das Verhalten von AGP 7.0 beizubehalten, indem Sie der Datei proguard-rules.pro die Option -ignorewarnings hinzufügen. Dies wird jedoch nicht empfohlen.

Build-Cache des Android-Gradle-Plug-ins entfernt

Der AGP-Build-Cache wurde in AGP 4.1 entfernt. Der zuvor in AGP 2.3 eingeführte AGP-Build-Cache wurde als Ergänzung zum Gradle-Build-Cache eingeführt und vollständig durch den Gradle-Build-Cache in AGP 4.1 ersetzt. Diese Änderung hat keine Auswirkungen auf die Build-Dauer.

In AGP 7.0 wurden die Attribute android.enableBuildCache und android.buildCacheDir und die Aufgabe cleanBuildCache entfernt.

Java 11-Quellcode in einem Projekt verwenden

Sie können jetzt im Projekt Ihrer App bis zu Java 11-Quellcode kompilieren. Dadurch können Sie neuere Sprachfeatures wie private Oberflächenmethoden, den Diamantoperator für anonyme Klassen und die lokale Variablensyntax für Lambda-Parameter verwenden.

Zum Aktivieren dieser Funktion setzen Sie compileOptions auf die gewünschte Java-Version und compileSdkVersion auf 30 oder höher:

// 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 es durch api oder implementation ersetzt.
    Gilt auch für Varianten vom Typ *Compile. Beispiel: debugCompile.
  • provided
    Dieses Element wurde durch compileOnly ersetzt.
    Gilt auch für Varianten vom Typ *Bereitgestellt, z. B. releaseProvided.
  • apk
    Dieses Element wurde durch runtimeOnly ersetzt.
  • publish
    Dieses Element wurde durch runtimeOnly ersetzt.

In den meisten Fällen migriert der AGP Upgrade Assistant Ihr Projekt automatisch zu den neuen Konfigurationen.

Classpath-Änderung beim Kompilieren mit dem Android-Gradle-Plug-in

Bei der Kompilierung mit dem Android-Gradle-Plug-in kann sich der Kompilierungsklassenpfad ändern. Da AGP jetzt api/implementation-Konfigurationen intern verwendet, werden möglicherweise einige Artefakte aus Ihrem Kompilierungsklassenpfad entfernt. Wenn Sie bei der Kompilierung von einer AGP-Abhängigkeit abhängig sind, müssen Sie diese als explizite Abhängigkeit hinzufügen.

Das Hinzufügen nativer Bibliotheken in einem Java-Ressourcenordner wird nicht unterstützt

Bisher konnten Sie eine native Bibliothek in einem Java-Ressourcenordner 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. Verwende stattdessen die für native Bibliotheken vorgesehene DSL-Methode: android.sourceSets.main.jniLibs.srcDirs. 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 Multiplatform-Plug-in 1.5.0 und höher kompatibel. Projekte, die die Kotlin Multiplatform-Unterstü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 ein Downgrade des Android-Gradle-Plug-ins auf Version 4.2.x vornehmen. Dies wird jedoch nicht empfohlen.

Weitere Informationen finden Sie unter KT-43944.

Lint-Ausgabe fehlt

Es wird kein Lint-Text an stdout ausgegeben, wenn die Lint-Aufgabe auf dem neuesten Stand ist (Problem #191897708). Weitere Informationen finden Sie unter Verhaltensänderungen für Lint. Dieses Problem wird im Android-Gradle-Plug-in 7.1 behoben.

Nicht alle Abhängigkeiten der Bibliothek mit dynamischen Funktionen werden mit Lint geprüft

Wenn Sie Lint mit checkDependencies = true aus einem Anwendungsmodul ausführen, werden Abhängigkeiten von Bibliotheksbibliotheken mit dynamischen Funktionen nur geprüft, wenn es sich auch um Anwendungsabhängigkeiten handelt (Problem 191977888). Als Behelfslösung kann die Lint-Aufgabe auf diesen Bibliotheken ausgeführt werden. Weitere Informationen finden Sie unter Verhaltensänderungen für Lint.