Das Android-Gradle-Plug-in 9.0 ist ein wichtiger Release, der API- und Verhaltensänderungen mit sich bringt.
Wenn Sie auf das Android-Gradle-Plug-in 9.0.1 aktualisieren möchten, verwenden Sie den Android-Gradle-Plug-in-Upgrade-Assistenten. Der AGP-Upgrade-Assistent hilft Ihnen, das bestehende Verhalten beim Upgrade Ihres Projekts beizubehalten, wenn dies sinnvoll ist. So können Sie Ihr Projekt auf AGP 9.0 aktualisieren, auch wenn Sie noch nicht bereit sind, alle neuen Standardeinstellungen in AGP 9.0 zu übernehmen.
Außerdem stehen zwei Agenten-Skills zur Verfügung, die den Upgradevorgang vereinfachen. Wenn Sie eine App ohne KMP haben, probieren Sie den AGP 9-Upgrade-Skill aus dem Android-Skills-Repository aus. Für eine KMP-App können Sie den AGP 9-Upgrade-Skill von JetBrains ausprobieren. Weitere Informationen zur Verwendung von Skills in Android Studio finden Sie unter Agent-Modus mit Skills erweitern.
Kompatibilität
Das maximale API-Level, das vom Android-Gradle-Plug-in 9.0 unterstützt wird, ist API-Level 36.1. Hier sind weitere Informationen zur Kompatibilität:
| Mindestversion | Standardversion | Hinweise | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Weitere Informationen finden Sie unter Gradle aktualisieren. |
| SDK-Build-Tools | 36.0.0 | 36.0.0 | Installieren oder konfigurieren Sie die SDK-Build-Tools. |
| NDK | – | 28.2.13676358 | Installieren Sie oder konfigurieren Sie eine andere Version des NDK. |
| JDK | 17 | 17 | Weitere Informationen finden Sie unter JDK-Version festlegen. |
| Kotlin-Gradle-Plug-in (KGP) | 2.2.10 | 2.2.10 | Weitere Informationen finden Sie unter Laufzeitabhängigkeit vom Kotlin-Gradle-Plug-in. |
Die android-DSL-Klassen implementieren jetzt nur noch die neuen öffentlichen Schnittstellen.
In den letzten Jahren haben wir neue Schnittstellen für unsere DSL und API eingeführt, um besser steuern zu können, welche APIs öffentlich sind. In den AGP-Versionen 7.x und 8.x wurden weiterhin die alten DSL-Typen (z. B. BaseExtension) verwendet, die auch die neuen öffentlichen Schnittstellen implementierten, um die Kompatibilität während der Arbeit an den Schnittstellen aufrechtzuerhalten.
AGP 9.0 verwendet ausschließlich unsere neuen DSL-Schnittstellen und die Implementierungen wurden auf neue Typen umgestellt, die vollständig ausgeblendet sind. Dadurch wird auch der Zugriff auf die alte, verworfene Variant API entfernt.
Für ein Update auf AGP 9.0 müssen Sie möglicherweise Folgendes tun:
- Prüfen Sie, ob Ihr Projekt mit dem integrierten Kotlin kompatibel ist:Das
org.jetbrains.kotlin.android-Plug-in ist nicht mit der neuen DSL kompatibel. KMP-Projekte auf das Android Gradle Library-Plug-in für KMP umstellen:Die Verwendung des
org.jetbrains.kotlin.multiplatform-Plug-ins im selben Gradle-Unterprojekt wie die Plug-inscom.android.libraryundcom.android.applicationist nicht mit der neuen DSL kompatibel.Build-Dateien aktualisieren: Die Änderung der Schnittstellen soll die DSL so ähnlich wie möglich halten, es kann jedoch einige kleine Änderungen geben.
Aktualisieren Sie Ihre benutzerdefinierte Build-Logik, um auf die neue DSL und API zu verweisen: Ersetzen Sie alle Verweise auf die interne DSL durch die öffentlichen DSL-Schnittstellen. In den meisten Fällen ist dies ein Eins-zu-eins-Ersatz. Ersetzen Sie alle Verwendungen der
applicationVariants- und ähnlicher APIs durch die neueandroidComponentsAPI. Das kann komplexer sein, da dieandroidComponentsAPI so konzipiert ist, dass sie stabiler ist, damit Plug-ins länger kompatibel bleiben. Beispiele finden Sie in unseren Gradle-Anleitungen.Plug-ins von Drittanbietern aktualisieren: Einige Plug-ins von Drittanbietern hängen möglicherweise noch von Schnittstellen oder APIs ab, die nicht mehr verfügbar sind. Migrieren Sie zu Versionen dieser Plug-ins, die mit AGP 9.0 kompatibel sind.
Durch die Umstellung auf die neuen DSL-Schnittstellen wird verhindert, dass Plug-ins und Gradle-Build-Skripts verschiedene verworfene APIs verwenden, darunter:
Verworfene API im Block android |
Funktion | Ersetzen |
|---|---|---|
applicationVariants,libraryVariants,testVariants undunitTestVariants
|
Erweiterungspunkte für Plug-ins, um dem AGP neue Funktionen hinzuzufügen. |
Ersetzen Sie dies durch die androidComponents.onVariants-API, z. B.:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Ermöglicht das Deaktivieren ausgewählter Varianten. |
Ersetzen Sie dies durch die androidComponents.beforeVariants-API, z. B.:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider undtestServer
|
Registrierung benutzerdefinierter Testumgebungen zum Ausführen von Tests auf Android-Geräten und -Emulatoren. | Wechseln Sie zu von Gradle verwalteten Geräten. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable undadbExe
|
Verwendung verschiedener Komponenten des Android SDK für benutzerdefinierte Aufgaben. |
Wechseln Sie zu androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider undwrapJavaSourceSet |
Veraltete Funktionen, die sich hauptsächlich auf die Verarbeitung generierter Quellen in Android Studio beziehen und in AGP 7.2.0 nicht mehr funktionieren. | Es gibt keinen direkten Ersatz für diese APIs. |
dexOptions
|
Veraltete Einstellungen für das Tool dx, das durch d8 ersetzt wurde. Keine der Einstellungen hat seit dem Android-Gradle-Plug-in 7.0 Auswirkungen.
|
Es gibt keinen direkten Ersatz. |
generatePureSplits
|
Konfigurations-Splits für Instant-Apps generieren. | Die Möglichkeit, Konfigurations-Splits zu versenden, ist jetzt in Android App Bundles integriert. |
aidlPackagedList
|
AIDL-Dateien, die im AAR verpackt werden sollen, um sie als API für Bibliotheken und Apps bereitzustellen, die von dieser Bibliothek abhängen. |
Dies wird weiterhin auf LibraryExtension, aber nicht auf den anderen Erweiterungstypen angezeigt.
|
Wenn Sie auf AGP 9.0 aktualisieren und die folgende Fehlermeldung angezeigt wird, bedeutet das, dass Ihr Projekt noch auf einige der alten Typen verweist:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Wenn Sie durch inkompatible Drittanbieter-Plug-ins blockiert werden, können Sie die alten Implementierungen für die DSL sowie die alte Varianten-API wiederherstellen.
Dabei sind auch die neuen Schnittstellen verfügbar und Sie können Ihre eigene Build-Logik auf die neue API aktualisieren. Wenn Sie dies nicht möchten, fügen Sie diese Zeile in Ihre gradle.properties-Datei ein:
android.newDsl=false
Alternativ können Sie für eine schrittweise Migration in AGP 9.4 einzelne Module deaktivieren. Weitere Informationen finden Sie unter Variant API-Modul deaktivieren.
Die vorherigen Klassen sind in AGP 9.0 als veraltet markiert. Das bedeutet, dass für Projekte, die das Flag newDsl deaktivieren, Warnungen zur Einstellung angezeigt werden, auch im Block android selbst.
Sie können auch mit dem Upgrade auf die neuen APIs beginnen, bevor Sie ein Upgrade auf AGP 9.0 durchführen. Die neuen Schnittstellen sind in vielen AGP-Versionen vorhanden, sodass Sie eine Mischung aus neuen und alten Schnittstellen verwenden können. In der AGP API-Referenzdokumentation finden Sie die API-Oberfläche für jede AGP-Version und Informationen dazu, wann die einzelnen Klassen, Methoden und Felder hinzugefügt wurden.
Wir wenden uns an die Autoren häufig verwendeter Plug-ins, um ihnen bei der Anpassung und Veröffentlichung von Plug-ins zu helfen, die vollständig mit den neuen Modi kompatibel sind. Außerdem werden wir den AGP-Upgrade-Assistenten in Android Studio weiter verbessern, um Sie bei der Migration zu unterstützen.
Wenn Sie feststellen, dass in der neuen DSL oder Variant API Funktionen fehlen, melden Sie das Problem so schnell wie möglich.
Integriertes Kotlin
Das Android-Gradle-Plug-in 9.0 bietet integrierte Kotlin-Unterstützung, die standardmäßig aktiviert ist. Das bedeutet, dass Sie das Plug-in org.jetbrains.kotlin.android (oder kotlin-android) nicht mehr in Ihren Build-Dateien anwenden müssen, um Kotlin-Quelldateien zu kompilieren.
Dadurch wird die Kotlin-Integration mit AGP vereinfacht, die Verwendung verworfener APIs vermieden und in einigen Fällen die Leistung verbessert.
Wenn Sie Ihr Projekt auf AGP 9.0 aktualisieren, müssen Sie daher auch zu integriertem Kotlin migrieren oder die Option deaktivieren.
Sie können die integrierte Kotlin-Unterstützung auch selektiv für Gradle-Unterprojekte deaktivieren, die keine Kotlin-Quellen haben.
Laufzeitabhängigkeit vom Kotlin-Gradle-Plug-in
Für die integrierte Kotlin-Unterstützung hat das Android-Gradle-Plug-in 9.0 jetzt eine Laufzeitabhängigkeit vom Kotlin-Gradle-Plug-in (KGP) 2.2.10. Das bedeutet, dass Sie keine KGP-Version mehr deklarieren müssen. Wenn Sie eine KGP-Version vor 2.2.10 verwenden, aktualisiert Gradle Ihre KGP-Version automatisch auf 2.2.10. Wenn Sie eine KSP-Version vor 2.2.10-2.0.2 verwenden, wird sie vom AGP auf 2.2.10-2.0.2 aktualisiert, damit sie der KGP-Version entspricht.
Upgrade auf eine höhere KGP-Version
Wenn Sie eine höhere Version von KGP oder KSP verwenden möchten, fügen Sie der Build-Datei auf oberster Ebene Folgendes hinzu:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Downgrade auf eine niedrigere KGP-Version
Sie können die KGP-Version nur dann downgraden, wenn Sie integriertes Kotlin deaktiviert haben. Das liegt daran, dass AGP 9.0 standardmäßig integriertes Kotlin aktiviert und integriertes Kotlin KGP 2.2.10 oder höher erfordert.
Wenn Sie eine niedrigere Version von KGP oder KSP verwenden möchten, deklarieren Sie diese Version in Ihrer Build-Datei auf oberster Ebene mit einer strikten Versionsdeklaration:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Die niedrigste KGP-Version, auf die Sie ein Downgrade durchführen können, ist 2.0.0.
IDE-Unterstützung für Testvorrichtungen
AGP 9.0 bietet vollständige Android Studio IDE-Unterstützung für Testvorrichtungen.
Fused Library-Plug-in
Mit dem Fused Library-Plug-in (Vorabversion) können Sie mehrere Bibliotheken als ein einziges Android-Bibliotheks-AAR veröffentlichen. So können Ihre Nutzer Ihre veröffentlichten Artefakte leichter verwenden.
Informationen zu den ersten Schritten finden Sie unter Mehrere Android-Bibliotheken mit Fused Library als eine veröffentlichen.
Geändertes Verhalten
Das Android-Gradle-Plug-in 9.0 bietet die folgenden neuen Verhaltensweisen:
| Verhalten | Empfehlung |
|---|---|
Das Android-Gradle-Plug-in 9.0 verwendet standardmäßig die NDK-Version r28c.
|
Du solltest die NDK-Version, die du verwenden möchtest, explizit angeben. |
| Das Android-Gradle-Plug-in 9.0 erfordert standardmäßig, dass Nutzer einer Bibliothek dieselbe oder eine höhere Compile-SDK-Version verwenden. |
Verwenden Sie beim Verwenden einer Bibliothek dasselbe oder ein höheres Kompilierungs-SDK.
Wenn das nicht möglich ist oder Sie Nutzern einer von Ihnen veröffentlichten Bibliothek mehr Zeit für die Umstellung geben möchten, legen Sie AarMetadata.minCompileSdk explizit fest.
|
AGP 9.0 enthält Aktualisierungen der Standardwerte der folgenden Gradle-Properties. So können Sie das AGP 8.13-Verhalten beim Upgrade beibehalten:
| Attribut | Funktion | Änderung von AGP 8.13 zu AGP 9.0 | Empfehlung |
|---|---|---|---|
android. |
Verwenden Sie die neuen DSL-Schnittstellen, ohne die Legacy-Implementierungen des android-Blocks offenzulegen.Das bedeutet auch, dass die alte Variant API, z. B. android.applicationVariants, nicht mehr zugänglich ist.
|
false → true |
Sie können dies deaktivieren, indem Sie android.newDsl=false festlegen.Sobald alle Plug-ins und die Build-Logik, die Ihr Projekt verwendet, kompatibel sind, entfernen Sie die Deaktivierung. |
android. |
Aktiviert integriertes Kotlin | false → true |
Migrieren Sie nach Möglichkeit zu integriertem Kotlin oder deaktivieren Sie die Funktion. |
android. |
Erzwingt, dass jede Bibliothek einen eindeutigen Paketnamen hat. | false → true |
Geben Sie für alle Bibliotheken in Ihrem Projekt eindeutige Paketnamen an. Wenn das nicht möglich ist, können Sie diese Meldung während der Migration deaktivieren. |
android. |
Verwenden Sie standardmäßig androidx-Abhängigkeiten.
|
false → true |
androidx-Abhängigkeiten übernehmen.
|
android. |
Führen Sie standardmäßig On-Device-Tests mit der Klasse androidx.test.runner.AndroidJUnitRunner aus und ersetzen Sie die Standardeinstellung der verworfenen Klasse InstrumentationTestRunner für
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Übernehmen Sie AndroidJUnitRunner oder geben Sie Ihre benutzerdefinierte testInstrumentationRunner explizit an.
|
android. |
Steuert die Verwendung von Abhängigkeitseinschränkungen zwischen Konfigurationen. Der Standardwert in AGP 9.0 ist false. Dabei werden Einschränkungen nur in Gerätetests für Anwendungen (AndroidTest) verwendet.
Wenn Sie diese Richtlinie auf true setzen, wird das Verhalten von Version 8.13 wiederhergestellt.
|
true → false |
Verwenden Sie Abhängigkeitsbeschränkungen nicht überall, es sei denn, Sie benötigen sie. Wenn Sie den neuen Standardwert dieser Meldung akzeptieren, werden auch Optimierungen beim Import von Projekten aktiviert, die die Importzeit für Builds mit vielen Android-Bibliotheks-Unterprojekten verkürzen sollten. |
android. |
Code in Anwendungen wird mit einer nicht endgültigen R-Klasse kompiliert, wodurch die Anwendungskompilierung an die Bibliothekskompilierung angepasst wird. Dadurch wird die Steigerung der Conversions verbessert und der Weg für zukünftige Leistungsoptimierungen des Ressourcenverarbeitungsablaufs geebnet. |
false → true |
Viele Projekte können das neue Verhalten einfach ohne Änderungen am Quellcode übernehmen. Wenn die Felder der R-Klasse an einer Stelle verwendet werden, die eine Konstante erfordert, z. B. in Switch-Anweisungen, müssen Sie sie so refaktorieren, dass verkettete If-Anweisungen verwendet werden. |
android. |
Verwendet die SDK-Kompilierungsversion als Standardwert für die SDK-Zielversion in Apps und Tests. Vor dieser Änderung wurde die SDK-Zielversion standardmäßig auf die Mindest-SDK-Version festgelegt. |
false → true |
Geben Sie die SDK-Zielversion für Apps und Tests explizit an. |
android. |
Erstellt nur Unittest-Komponenten für den getesteten Build-Typ. Im Standardprojekt führt dies zu einem einzelnen Unit-Test für das Debugging. Zuvor wurden Unit-Tests für das Debugging oder den Release ausgeführt. |
false → true |
Wenn für Ihr Projekt keine Tests für Debug und Release erforderlich sind, müssen Sie nichts ändern. |
android. |
Der Build wird mit einem Fehler abgebrochen, wenn eine der im AGP DSL angegebenen Keep-Dateien auf der Festplatte fehlt. Vor dieser Änderung wurden Dateien mit Tippfehlern in Dateinamen stillschweigend ignoriert. | false → true |
Entferne alle ungültigen Deklarationen von ProGuard-Dateien |
android. |
Ermöglicht R8, weniger Android-Ressourcen beizubehalten, indem Klassen und Android-Ressourcen zusammen berücksichtigt werden. | false → true |
Wenn die Aufbewahrungsregeln Ihres Projekts bereits vollständig sind, müssen Sie nichts ändern. |
android. |
Ermöglicht R8, weniger beizubehalten, da der Standardkonstruktor nicht implizit beibehalten wird, wenn eine Klasse beibehalten wird.
Das bedeutet, dass -keep class A nicht mehr -keep class A { <init>(); }impliziert. |
false → true |
Wenn die Aufbewahrungsregeln Ihres Projekts bereits vollständig sind, müssen Sie nichts ändern.
Ersetzen Sie in den Beibehaltungsregeln Ihres Projekts -keep class A durch -keep class A { <init>(); }, wenn der Standardkonstruktor beibehalten werden soll.
|
android. |
Aktiviert resValues in allen Unterprojekten
|
true → false |
Aktivieren Sie resValues nur in den Unterprojekten, in denen es erforderlich ist, indem Sie in den Gradle-Build-Dateien dieser Projekte Folgendes festlegen:
android {
buildFeatures {
resValues = true
}
} |
android. |
Aktiviert die Shader-Kompilierung in allen Unterprojekten | true → false |
Aktiviere die Shader-Kompilierung nur in den Unterprojekten, die Shader enthalten, die kompiliert werden sollen. Lege dazu in den Gradle-Build-Dateien dieser Projekte Folgendes fest:
android {
buildFeatures {
shaders = true
}
} |
android. |
In AGP 9.0 unterstützt getDefaultProguardFile() nur proguard-android-optimize.txt und nicht proguard-android.txt. Dadurch soll eine versehentliche Verwendung des Flags dontoptimize verhindert werden, das in proguard-android.txt enthalten ist.
|
false → true |
Sie können dontoptimize explizit in einer benutzerdefinierten proguardFile angeben, wenn Sie die Optimierung vermeiden möchten, und gleichzeitig proguard-android-optimize.txt verwenden. Entferne das Flag dontoptimize nach Möglichkeit aus dieser Datei, da es die Vorteile der R8-Optimierung verringert. Wenn nicht, deaktivieren Sie die Option, indem Sie android.r8.globalOptionsInConsumerRules.disallowed=false festlegen.
|
android. |
Ab AGP 9.0 schlägt die Veröffentlichung von Android-Bibliotheken und Funktionsmodulen fehl, wenn die Keep-Dateien für Nutzer problematische Proguard-Konfigurationen enthalten. Consumer-Keep-Dateien, die globale Optionen wie dontoptimize oder dontobfuscate enthalten, sollten nur in Anwendungsmodulen verwendet werden und können die Optimierungsvorteile für Bibliotheksnutzer verringern. Bei der Kompilierung von Android-App-Modulen werden solche globalen Optionen stillschweigend ignoriert, wenn sie in eine vorkompilierte Abhängigkeit (JAR oder AAR) eingebettet sind. Sie können feststellen, wann dies der Fall ist, indem Sie in der Datei „configuration.txt“ (normalerweise unter einem Pfad wie <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) nach Kommentaren wie diesem suchen: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
In veröffentlichten Bibliotheken sollten alle inkompatiblen Regeln entfernt werden. In internen Bibliotheken sollten alle inkompatiblen, aber erforderlichen Regeln stattdessen in eine proguardFile in einem App-Modul verschoben werden. Deaktivieren Sie die Option, indem Sie android.r8.globalOptionsInConsumerRules.disallowed=false festlegen. Sobald alle Ihre Consumer-Keep-Dateien kompatibel sind, entfernen Sie die Deaktivierung.
|
android. |
Verhindert die Übergabe von Anbietern für generierte Quellen mit der DSL AndroidSourceSet.
|
false → true |
Verwenden Sie die Sources API auf androidComponents, um generierte Quellen zu registrieren.
|
android. |
Erfordert, dass der Shader-Compiler-Pfad explizit in local.properties festgelegt wird, wenn die Shader-Kompilierung aktiviert ist.
|
false → true |
Fügen Sie glslc.dir=/path/to/shader-tools zur local.properties Ihres Projekts hinzu.
|
Entfernte Funktionen
Mit dem Android-Gradle-Plug-in 9.0 werden die folgenden Funktionen entfernt:
- Unterstützung für eingebettete Wear OS-Apps
In AGP 9.0 wird die Unterstützung für das Einbetten von Wear OS-Apps entfernt, da diese in Google Play nicht mehr unterstützt werden. Dazu gehört das Entfernen derwearApp-Konfigurationen und derAndroidSourceSet.wearAppConfigurationName-DSL. Informationen zur Veröffentlichung deiner App für Wear OS findest du unter Für Wear OS verbreiten. androidDependencies- undsourceSets-Berichtsaufgabe- Unterstützung für unterteilte APKs basierend auf der Pixeldichte
In AGP 9.0 wird die Unterstützung für das Erstellen von unterteilten APKs basierend auf der Pixeldichte entfernt. Die Funktion und die zugehörigen APIs wurden entfernt. Wenn Sie APKs mit AGP 9.0 oder höher nach Pixeldichte aufteilen möchten, verwenden Sie App-Bundles.
Geänderte DSL
Das Android-Gradle-Plug-in 9.0 enthält die folgenden funktionsgefährdenden DSL-Änderungen:
Die Parametrisierung von
CommonExtensionwurde entfernt.An sich ist dies nur eine funktionsgefährdende Änderung auf Quellcodeebene, um zukünftige funktionsgefährdende Änderungen auf Quellcodeebene zu vermeiden. Sie bedeutet aber auch, dass die Blockmethoden von
CommonExtensionzuApplicationExtension,LibraryExtension,DynamicFeatureExtensionundTestExtensionverschoben werden müssen.Wenn Sie Ihr Projekt auf AGP 9.0 aktualisieren, müssen Sie den Gradle-Plug-in-Code, der diese Parameter oder die Blockmethoden verwendet, refaktorieren. Das folgende Plug-in wird beispielsweise aktualisiert, um den Typparameter zu entfernen und nicht auf die entfernten Blockmethoden zurückzugreifen:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }Bei Plug-ins, die auf eine Reihe von AGP-Versionen abzielen, ist die direkte Verwendung des Getters binärkompatibel mit AGP-Versionen vor 9.0.
Entfernte DSL
Im Android-Gradle-Plug-in 9.0 wurden folgende Elemente entfernt:
AndroidSourceSet.jni, weil es nicht funktioniert hat.AndroidSourceSet.wearAppConfigurationName, da die Unterstützung für eingebettete Wear OS-Apps entfernt wurde.BuildType.isRenderscriptDebuggable, weil es nicht funktioniert hat.DependencyVariantSelection. Es wird durchDependencySelectionersetzt, das alskotlin.android.localDependencySelectionverfügbar gemacht wird.Installation.installOptions(String). Es wird durch das änderbare Attribut vonInstallation.installOptionsersetzt.Der experimentelle, aber nie stabilisierte
PostProcessing-Block.ProductFlavor.setDimension, das durch das Attributdimensionersetzt wirdLanguageSplitOptions, das nur für Google Play Instant nützlich war, das eingestellt wurde.DensitySplit, da die Funktion nicht mehr unterstützt wird. Stattdessen sollten App-Bundles verwendet werden.
Entfernte APIs
Im Android-Gradle-Plug-in 9.0 wurden folgende Elemente entfernt:
AndroidComponentsExtension.finalizeDSl. Es wird durchfinalizeDslersetzt.Component.transformClassesWith. Es wird durchInstrumentation.transformClassesWithersetzt.Component.setAsmFramesComputationMode. Es wird durchInstrumentation.setAsmFramesComputationModeersetzt.ComponentBuilder.enabled. Es wird durchComponentBuilder.enableersetzt.DependenciesInfoBuilder.includedInApk. Es wird durchincludeInApkersetzt.DependenciesInfoBuilder.includedInBundle. Es wird durchincludeInBundleersetzt.GeneratesApk.targetSdkVersion. Es wird durchtargetSdkersetzt.Variant.minSdkVersion. Es wird durchminSdkersetzt.Variant.maxSdkVersion. Es wird durchmaxSdkersetzt.Variant.targetSdkVersion. Es wird durchtargetSdkersetzt.Variant.unitTest, da es nicht auf dascom.android.test-Plug-in anwendbar war.unitTestist fürVariantBuilder-Untertypen verfügbar, dieHasUnitTesterweitern.VariantBuilder.targetSdkundtargetSdkPreview, da sie in Bibliotheken nicht sinnvoll waren. Verwenden Sie stattdessenGeneratesApkBuilder.targetSdkoderGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, da es nicht auf dascom.android.test-Plug-in anwendbar war.enableUnitTestist fürVariantBuilder-Untertypen verfügbar, dieHasUnitTestBuildererweitern.VariantBuilder.unitTestEnabledwird zugunsten des einheitlicher benanntenenableUnitTestfür dieVariantBuilder-Untertypen entfernt, dieHasUnitTestBuildererweitern.VariantOutput.enable. Es wird durchenabledersetzt.Die verworfenen und deaktivierten
FeaturePluginundFeatureExtension.Die verworfenen und deaktivierten
BaseExtension.registerTransform-APIs, die nur beibehalten wurden, um die Kompilierung mit der neuesten AGP-Version zu ermöglichen, während die Ausführung auf AGP 4.2 oder niedriger erfolgt.
Entfernte Gradle-Eigenschaften
Die folgenden Gradle-Properties wurden ursprünglich hinzugefügt, um standardmäßig aktivierte Funktionen global zu deaktivieren.
Diese Funktionen sind seit AGP 8.0 oder niedriger standardmäßig deaktiviert. Aktivieren Sie diese Funktionen nur in den Unterprojekten, in denen sie verwendet werden, um einen effizienteren Build zu ermöglichen.
| Attribut | Funktion | Ersetzen |
|---|---|---|
android. |
Aktiviert die AIDL-Kompilierung in allen Unterprojekten |
Aktivieren Sie die AIDL-Kompilierung nur in den Unterprojekten, in denen AIDL-Quellen vorhanden sind. Legen Sie dazu in den Gradle-Build-Dateien dieser Projekte das folgende Attribut fest:
android {
buildFeatures {
aidl = true
}
} |
android. |
Aktiviert die RenderScript-Kompilierung in allen Unterprojekten. |
Aktivieren Sie die RenderScript-Kompilierung nur in den Unterprojekten, in denen RenderScript-Quellen vorhanden sind. Legen Sie dazu in den Gradle-Build-Dateien dieser Projekte das folgende Attribut fest:
android {
buildFeatures {
renderScript = true
}
} |
Erzwungene Gradle-Attribute
AGP 9.0 gibt einen Fehler aus, wenn Sie die folgenden Gradle-Properties festlegen.
Der Android-Gradle-Plug-in-Upgrade-Assistent aktualisiert Projekte, die diese Properties verwenden, nicht auf AGP 9.0.
| Attribut | Funktion |
|---|---|
android. |
Die Entfernung von Ressourcen wird jetzt immer als Teil von R8 ausgeführt. Die vorherige Implementierung wurde entfernt. |
android. |
Bei der Entfernung von Ressourcen wird jetzt immer die präzise Entfernung von Ressourcen verwendet, sodass mehr entfernt werden kann. |
R8-Änderungen
Die folgenden R8-Änderungen sind in AGP 9.0.0 enthalten.
Neue Konfigurationsoption -processkotlinnullchecks
Wir haben die neue R8-Option -processkotlinnullchecks hinzugefügt, mit der Sie R8 für die Verarbeitung von Kotlin-Null-Prüfungen konfigurieren können. Die Option verwendet ein obligatorisches Argument, das einen der folgenden drei Werte haben muss: keep, remove_message und remove.
Mit der Option werden die folgenden Null-Prüfungen verarbeitet, die vom Kotlin-Compiler hinzugefügt wurden:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Die Optionswerte, sortiert vom schwächsten zum stärksten, haben die folgende Wirkung:
keepändert die Prüfungen nicht.remove_messageschreibt jeden Aufruf der Prüfmethode in einen Aufruf vongetClass()für das erste Argument des Aufrufs um. Dadurch wird die Nullprüfung beibehalten, aber ohne Nachricht.removeentfernt die Prüfungen vollständig.
Standardmäßig verwendet R8 remove_message. Jede Angabe von -processkotlinnullchecks überschreibt dies. Wenn sie mehrmals angegeben wird, wird der stärkste Wert verwendet.
Weitergabe von Informationen zum Beibehalten an Companion-Methoden beenden
Wenn Beibehaltungsregeln mit Schnittstellenmethoden übereinstimmen, die der Entzuckerung unterliegen, hat R8 zuvor die Bits Optimierung nicht zulassen und Verkleinerung nicht zulassen intern an die synthetisierten Companion-Methoden übertragen.
Ab AGP 9.0 gelten Keep-Regeln nicht mehr für Companion-Methoden. Dies entspricht der Tatsache, dass Beibehaltungsregeln nicht auf andere vom Compiler synthetisierte Felder/Methoden/Klassen anwendbar sind.
Durch die Übertragung der Bits disallow optimization und disallow shrinking auf die Companion-Methoden wurde der folgende Anwendungsfall zuvor unterstützt:
- Kompilieren Sie eine Bibliothek mit
default/static/private-Schnittstellenmethoden zu DEX mitminSdk< 24 und Regeln, die die Schnittstellenmethoden beibehalten. - Kompilieren Sie eine App mit der Bibliothek im Klassenpfad und
-applymapping. - Führen Sie die App und die Bibliothek zusammen.
Beachten Sie, dass dies nur mit -applymapping funktioniert, da das disallow
obfuscation-Bit nicht an die Companion-Methoden übertragen wird. Das bedeutet, dass die in Schritt 1 generierten Companion-Klassen verschleierte Methodennamen haben.
Dieser Anwendungsfall wird für minSdk < 24 nicht mehr unterstützt. Gehen Sie so vor, um das Problem zu umgehen:
- Desugar der Bibliothek mit
default/static/private-Schnittstellenmethoden in Klassendateien mitminSdk< 24. - Kompilieren Sie das entzuckerte Artefakt mit R8 und Regeln, die die Schnittstellenmethoden in den Companion-Klassen beibehalten.
- Kompilieren Sie die App mit der Bibliothek im Klassenpfad.
- Führen Sie die App und das entzuckerte Artefakt zusammen.
Ein weiterer Nebeneffekt ist, dass es nicht mehr möglich ist, die Attribute der inneren Klasse und der umschließenden Methode für anonyme und lokale Klassen in Companion-Methoden von Schnittstellen beizubehalten.
Standardmäßig ausgegebene Quelldatei in r8-map-id-<MAP_ID> ändern
Diese Änderung ist ab Version 8.12.0 im AGP enthalten.
Das standardmäßige Attribut für die ausgegebene Quelldatei für eine Klasse ändert sich von SourceFile zu r8-map-id-<MAP_ID>, wenn ein Retracing erforderlich ist (also wenn entweder die Obfuskation oder die Optimierung aktiviert ist).
Mit dem neuen Attribut für die Quelldatei kann die ID der Zuordnungsdatei, die für das Retracing erforderlich ist, aus einem verschleierten Stacktrace extrahiert werden. Dies kann verwendet werden, um das automatisierte Retracing von Stacktraces in Logcat zu unterstützen.
Wenn ein benutzerdefiniertes Quelldateiattribut (-renamesourcefileattribute) verwendet wird, hat dieses weiterhin Vorrang.
Im ProGuard-Kompatibilitätsmodus (wenn gradle.properties den Wert android.enableR8.fullMode=false enthält) wird das Quelldateiattribut r8-map-id-<MAP_ID> nur ausgegeben, wenn das Attribut SourceFile nicht beibehalten wird. Apps, die den ProGuard-Kompatibilitätsmodus verwenden und die Zuordnungsdatei-ID in ihre Stacktraces aufnehmen möchten, sollten -keepattributes SourceFile entfernen (oder zum vollständigen R8-Modus migrieren).
Die in r8-map-id-<MAP_ID> verwendete Karten-ID ist der vollständige Karten-Hash und nicht ein siebenstelliges Präfix des Karten-Hashs, das zuvor verwendet wurde.
Verwendung minimierter synthetischer Namen bei der L8-Entzuckerung aktivieren
Der Name der von D8 generierten synthetischen Klassen enthält normalerweise den Teilstring $$ExternalSynthetic, der angibt, dass es sich um eine von D8 generierte synthetische Klasse handelt.
Außerdem wird im Namen des synthetischen Elements auch die Art des synthetischen Elements codiert (z. B. Backport, Lambda). Dies wirkt sich negativ auf die resultierende DEX-Größe aus, da die Klassennamen mehr Platz im Stringpool einnehmen.
Das AGP 9.0 konfiguriert L8 (Entzuckerung der Kernbibliothek) so, dass die DEX-Datei mit allen j$-Klassen ein neues, verkürztes Klassennamenformat für synthetische Klassen verwendet. Der neue Klassenname verwendet eine numerische ID (z. B. $1).
Unterstützung für -addconfigurationdebugging entfernen
In AGP 9.0 wird die Unterstützung für -addconfigurationdebugging entfernt. Der Compiler gibt jetzt eine Warnung aus, wenn das Flag verwendet wird.
Unterstützung für das Generieren von L8-Regeln aus D8/R8 entfernt
Diese Änderung ist nur für Entwickler relevant, die die D8/R8-Befehlszeile oder APIs direkt verwenden.
In R8 9.0 wird die Unterstützung für das Generieren von Beibehaltungsregeln für L8 aus D8 und R8 entfernt.
Verwenden Sie stattdessen TraceReferences.
Insbesondere werden die Methoden D8Command.builder.setDesugaredLibraryKeepRuleConsumer und R8Command.Builder.setDesugaredLibraryKeepRuleConsumer entfernt und die Unterstützung für --desugared-lib-pg-conf-output wird aus den Befehlszeilenoptionen von D8 und R8 entfernt.
Behobene Probleme
Android-Gradle-Plug-in 9.0.0
| Behobene Probleme | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Android Gradle-Plug-in |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Lint-Integration |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||