Android-Gradle-Plug-in 4.1.0 (August 2020)

Kompatibilität

Mindestversion Standardversion Hinweise
Gradle 6.5 Weitere Informationen finden Sie unter Gradle aktualisieren.
SDK-Build-Tools 29.0.2 29.0.2 Installieren oder konfigurieren Sie die SDK-Build-Tools.
NDK 21.1.6352462 Installieren oder konfigurieren Sie eine andere Version des NDK.

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

Neue Funktionen

Diese Version des Android-Gradle-Plug-ins enthält die folgenden neuen Funktionen.

Unterstützung für Kotlin-Skript-DSL

Um die Bearbeitung für Nutzer von Kotlin-Build-Skripten zu verbessern, sind die DSL und APIs des Android-Gradle-Plug-ins 4.1 jetzt in einer Reihe von Kotlin Schnittstellen definiert, die von ihren Implementierungsklassen getrennt sind. Das bedeutet Folgendes:

  • Null-Zulässigkeit und Mutabilität werden jetzt explizit für Kotlin-Typen deklariert.
  • Die aus diesen Schnittstellen generierte Dokumentation wird in der Kotlin-API-Referenz veröffentlicht.
  • Die API-Oberfläche des Android-Gradle-Plug-ins ist klar definiert, damit Android-Builds in Zukunft weniger fehleranfällig sind.

Wichtig: Wenn Sie bereits KTS-Build-Skripte verwenden oder Kotlin in buildSrc, kann dies zu Inkompatibilitäten mit dem Quellcode für bestimmte Fehler führen die in früheren Versionen als Laufzeitfehler aufgetreten wären.

Sammlungstypen, die in der DSL geändert werden sollen, werden jetzt einheitlich definiert als:

val collection: MutableCollectionType

Das bedeutet, dass es nicht mehr möglich ist, in Kotlin-Skripten für einige Sammlungen, die dies zuvor unterstützt haben, Folgendes zu schreiben:

collection = collectionTypeOf(...)

Die Mutation der Sammlung wird jedoch einheitlich unterstützt, sodass collection += … und collection.add(...) jetzt überall funktionieren sollten.

Wenn Sie beim Upgrade eines Projekts, das Android-Gradle Plug-in-Kotlin-APIs und -DSL verwendet, auf Probleme stoßen, melden Sie einen Fehler.

C/C++-Abhängigkeiten aus AARs exportieren

Mit dem Android-Gradle-Plug-in 4.0 wurde die Möglichkeit hinzugefügt, Prefab Pakete in AAR-Abhängigkeiten zu importieren. In AGP 4.1, es ist jetzt möglich, Bibliotheken aus Ihrem externen nativen Build in eine AAR für ein Android-Bibliotheksprojekt zu exportieren.

Fügen Sie dazu dem android-Block der build.gradle-Datei Ihres Bibliotheksprojekts Folgendes hinzu:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

In diesem Beispiel werden die mylibrary und myotherlibrary Bibliotheken aus Ihrem externen nativen Build mit ndk-build oder CMake in der von Ihrem Build erstellten AAR verpackt. Jede Bibliothek exportiert die Header aus dem angegebenen Verzeichnis in ihre Abhängigkeiten.

Hinweis: Für Nutzer des Android-Gradle-Plug-ins 4.0 und höher haben sich die Konfigurationseinstellungen für den Import vorgefertigter nativer Bibliotheken geändert. Weitere Informationen finden Sie in den Versionshinweisen zu Version 4.0.

R8-Unterstützung für Kotlin-Metadaten

Kotlin verwendet benutzerdefinierte Metadaten in Java-Klassendateien, um Kotlin-Sprachkonstrukte zu identifizieren. R8 unterstützt jetzt das Beibehalten und Umschreiben von Kotlin Metadaten, um die Komprimierung von Kotlin-Bibliotheken und -Anwendungen mit kotlin-reflect vollständig zu unterstützen.

Fügen Sie die folgenden Keep-Regeln hinzu, um Kotlin-Metadaten beizubehalten:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

Dadurch wird R8 angewiesen, Kotlin-Metadaten für alle Klassen beizubehalten, die direkt beibehalten werden.

Weitere Informationen finden Sie unter Shrinking Kotlin libraries and applications using Kotlin reflection with R8{:.external} auf Medium.

Assertions in Debug-Builds

Wenn Sie die Debug-Version Ihrer App mit dem Android-Gradle-Plug-in 4.1.0 oder höher erstellen, schreibt der integrierte Compiler (D8) den Code Ihrer App neu, um Assertions zur Kompilierdauer zu ermöglichen. So sind Assertion-Prüfungen immer aktiv.

Geändertes Verhalten

Android-Gradle-Plug-in-Build-Cache 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 und in AGP 4.1 vollständig durch den Gradle-Build-Cache ersetzt. Diese Änderung hat keine Auswirkungen auf die Build-Dauer.

Die Aufgabe cleanBuildCache sowie die Properties android.enableBuildCache und android.buildCacheDir sind veraltet und werden in AGP 7.0 entfernt. Die android.enableBuildCache-Property hat derzeit keine Auswirkungen, während die android.buildCacheDir-Property und der cleanBuildCache-Task bis AGP 7.0 funktionieren, um vorhandene Inhalte des AGP-Build-Cache zu löschen.

App-Größe für Apps mit Codekomprimierung deutlich reduziert

Ab dieser Version werden Felder aus R-Klassen nicht mehr standardmäßig beibehalten. Das kann zu einer erheblichen Reduzierung der APK-Größe bei Apps führen, bei denen die Codekomprimierung aktiviert ist. Dies sollte nicht zu einer Verhaltensänderung führen, es sei denn, Sie greifen über Reflection auf R-Klassen zu. In diesem Fall ist es erforderlich, Keep-Regeln für diese R-Klassen hinzuzufügen.

Property „android.namespacedRClass“ in „android.nonTransitiveRClass“ umbenannt

Das experimentelle Flag android.namespacedRClass wurde in android.nonTransitiveRClass umbenannt.

Wenn dieses Flag in der gradle.properties Datei festgelegt ist, wird für die R-Klasse jeder Bibliothek ein Namespace erstellt, sodass die R-Klasse nur die in der Bibliothek selbst deklarierten Ressourcen enthält und keine aus den Abhängigkeiten der Bibliothek. Dadurch wird die Größe der R-Klasse für diese Bibliothek reduziert.

Kotlin-DSL: „coreLibraryDesugaringEnabled“ umbenannt

Die Kotlin DSL-Kompilierungsoption coreLibraryDesugaringEnabled wurde in isCoreLibraryDesugaringEnabled geändert. Weitere Informationen zu diesem Flag finden Sie unter Unterstützung für Entzuckerung von Java 8+-APIs (Android-Gradle-Plug-in 4.0.0+).

Versions-Properties aus der BuildConfig-Klasse in Bibliotheksprojekten entfernt

Nur für Bibliotheksprojekte wurden die BuildConfig.VERSION_NAME und BuildConfig.VERSION_CODE Properties aus der generierten BuildConfig Klasse entfernt, da diese statischen Werte nicht die endgültigen Werte des Versionscodes und -namens der Anwendung widerspiegelten und daher irreführend waren. Außerdem wurden diese Werte beim Zusammenführen des Manifests verworfen.

In einer zukünftigen Version des Android-Gradle-Plug-ins werden die versionName und versionCode Properties auch aus der DSL für Bibliotheken entfernt. Derzeit gibt es keine Möglichkeit, automatisch auf den App-Versionscode/-namen aus einem Bibliotheksunterprojekt zuzugreifen.

Für Anwendungsmodule gibt es keine Änderung. Sie können weiterhin Werte für versionCode und versionName in der DSL zuweisen. Diese Werte werden an das Manifest und die BuildConfig Felder der App weitergegeben.

NDK-Pfad festlegen

Sie können den Pfad zu Ihrer lokalen NDK-Installation mit der android.ndkPath Property in der build.gradle Datei Ihres Moduls festlegen.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

Wenn Sie diese Property zusammen mit der android.ndkVersion Property, verwenden, muss dieser Pfad eine NDK-Version enthalten, die mit android.ndkVersion übereinstimmt.

Verhaltensänderungen bei Unittests für Bibliotheken

Wir haben das Verhalten beim Kompilieren und Ausführen von Unittests für Bibliotheken geändert. Die Unittests einer Bibliothek werden jetzt für die Kompilierungs-/Laufzeitklassen der Bibliothek selbst kompiliert und ausgeführt. Dadurch wird die Bibliothek im Unittest auf dieselbe Weise verwendet wie in externen Unterprojekten. Diese Konfiguration führt in der Regel zu besseren Tests.

In einigen Fällen kann es bei Unittests für Bibliotheken, die die Datenbindung verwenden, zu fehlenden DataBindingComponent- oder BR-Klassen kommen. Diese Tests müssen in einen Instrumentierungstest im Projekt androidTest portiert werden, da das Kompilieren und Ausführen für diese Klassen in einem Unittest möglicherweise zu einer falschen Ausgabe führt.

Gradle-Plug-in „io.fabric“ eingestellt

Das Gradle-Plug-in „io.fabric“ ist eingestellt und nicht mit Version 4.1 des Android-Gradle-Plug-ins kompatibel. Weitere Informationen zum eingestellten Fabric SDK und zur Migration zum Firebase Crashlytics SDK finden Sie unter Auf das Firebase Crashlytics SDK upgraden.