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 bei 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. Sie können diese Warnung aber auch ignorieren. Zwei häufige Gründe, die Warnung zu ignorieren, sind:

  1. Bibliotheken, die auf die JVM ausgerichtet sind und die fehlende Klasse enthalten, sind vom Typ „JVM-Bibliothek“ (wie im Beispiel oben).

  2. 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 beeinträchtigen. 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 durch api oder implementation ersetzt.
    Gilt auch für Varianten vom Typ *Compile, z. B. debugCompile.
  • provided
    Dieser wurde durch compileOnly ersetzt.
    Gilt auch für *von Ihnen bereitgestellte Varianten, z. B.: releaseProvided.
  • apk
    Dieser wurde durch runtimeOnly ersetzt.
  • publish
    Dieser wurde durch runtimeOnly 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 jedoch davon 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.