Android-Gradle-Plug-in 9.0.1 (Januar 2026)

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-ins com.android.library und com.android.application ist 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 neue androidComponents API. Das kann komplexer sein, da die androidComponents API 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 und
unitTestVariants
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)
    }
}
Möglicherweise gibt es nicht für alle früheren APIs einen direkten Ersatz. Melden Sie ein Problem, wenn es einen Anwendungsfall gibt, der von den neuen Variant APIs nicht abgedeckt wird.
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 und
testServer
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 und
adbExe
Verwendung verschiedener Komponenten des Android SDK für benutzerdefinierte Aufgaben. Wechseln Sie zu androidComponents.sdkComponents.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider und
wrapJavaSourceSet
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.newDsl 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.builtInKotlin Aktiviert integriertes Kotlin false → true Migrieren Sie nach Möglichkeit zu integriertem Kotlin oder deaktivieren Sie die Funktion.
android.uniquePackageNames 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.useAndroidx Verwenden Sie standardmäßig androidx-Abhängigkeiten. false → true androidx-Abhängigkeiten übernehmen.
android.default.androidx.test.runner 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.dependency.useConstraints 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.enableAppCompileTimeRClass 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.sdk.defaultTargetSdkToCompileSdkIfUnset 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.onlyEnableUnitTestForTheTestedBuildType 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.proguard.failOnMissingFiles 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.r8.optimizedResourceShrinking 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.r8.strictFullModeForKeepRules 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.defaults.buildfeatures.resvalues 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.defaults.buildfeatures.shaders 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.r8.proguardAndroidTxt.disallowed 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.r8.globalOptionsInConsumerRules.disallowed 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.sourceset.disallowProvider 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.custom.shader.path.required 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 der wearApp-Konfigurationen und der AndroidSourceSet.wearAppConfigurationName-DSL. Informationen zur Veröffentlichung deiner App für Wear OS findest du unter Für Wear OS verbreiten.
  • androidDependencies- und sourceSets-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 CommonExtension wurde 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 CommonExtension zu ApplicationExtension, LibraryExtension, DynamicFeatureExtension und TestExtension verschoben 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:

Entfernte APIs

Im Android-Gradle-Plug-in 9.0 wurden folgende Elemente entfernt:

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.defaults.buildfeatures.aidl 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
  }
}
in der Gradle-Build-Datei jedes Unterprojekts, das AIDL-Quellen enthält
android.defaults.buildfeatures.renderscript 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.r8.integratedResourceShrinking Die Entfernung von Ressourcen wird jetzt immer als Teil von R8 ausgeführt. Die vorherige Implementierung wurde entfernt.
android.enableNewResourceShrinker.preciseShrinking 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_message schreibt jeden Aufruf der Prüfmethode in einen Aufruf von getClass() für das erste Argument des Aufrufs um. Dadurch wird die Nullprüfung beibehalten, aber ohne Nachricht.
  • remove entfernt 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:

  1. Kompilieren Sie eine Bibliothek mit default/static/private-Schnittstellenmethoden zu DEX mit minSdk < 24 und Regeln, die die Schnittstellenmethoden beibehalten.
  2. Kompilieren Sie eine App mit der Bibliothek im Klassenpfad und -applymapping.
  3. 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:

  1. Desugar der Bibliothek mit default/static/private-Schnittstellenmethoden in Klassendateien mit minSdk < 24.
  2. Kompilieren Sie das entzuckerte Artefakt mit R8 und Regeln, die die Schnittstellenmethoden in den Companion-Klassen beibehalten.
  3. Kompilieren Sie die App mit der Bibliothek im Klassenpfad.
  4. 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
Feature Request: Ideale AGP-Version als Property einfügen
SingleArtifact.VERSION_CONTROL_INFO_FILE stabilisieren
androidTest connectedCheck logcat-Ausgabe ist fehlerhaft
Integrierte Kotlin-Unterstützung in AGP sollte nicht mit den Kotlin-Quellsätzen synchronisiert werden
missingDimensionStrategy bevorzugt eine Variante, die mit dem eigenen Namen übereinstimmt, auch wenn sie aus einer nicht verwandten Dimension stammt
Integrierte Kotlin-Unterstützung in AGP sollte nicht mit den Kotlin-Quellsätzen synchronisiert werden
AGP 9.0.0-rc01 löst Kotlin-Bibliotheken nicht über die Funktion „kotlin()“ auf
Built-in-kotlin veröffentlicht keine kotlin-stdlib-Abhängigkeitseinschränkung in Maven-POM
Testlauf für Abweichung zwischen compileSdk und targetSdk hinzufügen
Leerer resConfigs-Wert führt zu unklarem aapt-Fehler
Reine Java-Projekte sind von der Kotlin-Standardbibliothek abhängig.
Veraltete KotlinMultiplatformAndroidCompilationBuilder-Properties in AGP 9.0 entfernen
`com.android.tools.build:gradle:9.0.0-alpha05` sollte eine API-Abhängigkeit von KGP und gradle-api haben
Gradle-Plug-in „com.android.experimental.built-in-kotlin“ umbenennen
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` funktioniert nicht
Aar-Metadatenprüfungen für compileSdk verwenden die alte DSL
Die verworfene Property „com.android.build.api.dsl.ManagedDevices.devices“ wurde entfernt.
Integrierte Kotlin-Unterstützung in AGP sollte nicht mit den Kotlin-Quellsätzen synchronisiert werden
Veröffentlichung der Android-Bibliothek schlägt fehl, wenn die Consumer-Keep-Datei „-dontobfuscate“ enthält
Keine Optionen zum Drucken der Zuordnung für optimierte Ressourcen
Fehler beim Aufrufen von „finalizeDsl“ nach dieser Phase
AGP initialisiert die Jetifier-Konfiguration, auch wenn Jetifier deaktiviert ist
In Kotlin erstellte Dateien fügen „kotlinStdlib“ nicht als Kompilierdauer-Abhängigkeit hinzu, wenn „kotlin.stdlib.default.dependency“ für Modul- und POM-Dateien auf „true“ gesetzt ist
Die neue Optimierungs-DSL erstellt standardmäßig keine „configuration.txt“-Datei
AGP 8.13.0 kann den Navigationsgraphen in einem Modul nicht verifizieren
AGP verwendet verworfene Gradle API: Multi-String-Notation
Nutzer warnen, die versuchen, die alte Multidex-Bibliothek mit minSdkVersion >=21 zu verwenden
Ein Build schlägt fehl, wenn Codegenerierungsaufgaben vorhanden sind.
Wenn „android.builtInKotlin=false“, „android.newDsl=false“ und „android.enableLegacyVariantApi=false“ festgelegt sind, schlägt die Verwendung des „kotlin-android“-Plug-ins mit der Fehlermeldung „API ‚applicationVariants‘ is obsolete“ fehl.
Integrierte Kotlin-Version kann nicht versionierte kotlin-stdlib nicht auflösen, wenn kotlin.stdlib.default.dependency=false
DexData öffnet eine Datei, ohne sie zu schließen, was die Bereinigung verhindert
AndroidSourceDirectorySet sollte in AGP 9.0 nicht mehr PatternFilterable erweitern
Test-Fixture-Fehler in Nur-Test-Modulen
Falscher Fehler bei Verwendung von Kontextempfängern in Test-Fixtures
Falsche IDE-Fehler für Kotlin-Code in testFixtures
Das Plug-in „legacy-kapt“ überspringt im Gegensatz zu „kotlin-kapt“ die Verarbeitung von Annotationen.
compileSdkSpec.minorApiLevel funktioniert nicht mit SettingsExtension
[fused lib - public] Generated fused library does not include sources
„extractNativeLibs“ und „useEmbeddedDex“ sollten nicht aus dem Manifest stammen
Warnungen von R8 in AGP 9.0.0-alpha09
Veraltetes AndroidSourceSet.jni in AGP 9.0 entfernen
Installation.installOptions() in AGP 9.0 entfernen
„BuildType.isRenderscriptDebuggable“ in AGP 9.0 entfernen.
android.defaults.buildfeatures.renderscript entfernen
`com.android.kotlin.multiplatform.library` stürzt bei von Gradle verwalteten Geräten ab
Entfernen der Standard-gradle.properties-Flags `android.defaults.buildfeatures.aidl`
Build schlägt fehl, wenn die Proguard-Datei nicht vorhanden ist
buildconfig-Standard-Flags aus gradle.properties entfernen
Der Standardwert für „targetSdk“ der App wird so geändert, dass er auf „compileSdk“ statt auf „minSdk“ basiert.
Wenn „isIncludeAndroidResources“ aktiviert ist, schlägt das Zusammenführen von „tools:overrideLibrary“-Verwendungen in AGP 8.12.0 durch „process{Variant}UnitTestManifest“ fehl.
AGP verursacht Einstellungswarnungen in Gradle für JVM-Testaufgaben
DependencyReportTask ist nicht mit dem Konfigurations-Cache kompatibel
In AGP 9.0 wird die Standard-Java-Version für Quelle/Ziel von Java 8 auf Java 11 umgestellt.
Standardwert von android.useAndroidX auf „true“ ändern
Bessere Ausnahme beim Anwenden des kapt-Plug-ins mit integriertem Kotlin.
android.proguard.failOnMissingFiles funktioniert nicht für consumerProguardFiles
Abhängigkeit des Kotlin-Gradle-Plug-ins auf 2.2.10 aktualisieren
KotlinJvmAndroidCompilation mit der KGP API erstellen
Expliziter Kotlin-API-Modus auf Testquellen angewendet
Lint
AGP 8.11.0: Die Aufgabe „lintAnalyzeRelease“ stürzt ab, wenn .gradle.kts-Dateien mit apply(from = "...") angewendet werden.
Die Lint-Prüfung „SdkIntAtLeast“ prüft nicht, ob der annotierte Wert korrekt ist
Integriertes Kotlin fügt META-INF kein .kotlin_module hinzu
Der Lint-Klassenpfad enthält doppelte Klassen in verschiedenen Versionen
Problemumgehung für das Überschreiben privater Ressourcen funktioniert nicht (tools:override = „true“)
Fehler: Beim Entfernen nicht verwendeter Ressourcen werden die Übersetzungen nicht entfernt und es wird auch nicht danach gefragt
Lint gibt die Warnung „Could not clean up K2 caches“ aus
Lint gibt die Warnung „Could not clean up K2 caches“ aus
Lint-Integration
Cache-Fehler bei AndroidLintAnalysisTask über verschiedene JDK-Anbieter oder Nebenversionen hinweg aufgrund von Unterschieden bei systemPropertyInputs.javaVersion
Lint verwendet trotz compileSdk automatisch das neueste installierte SDK, wird nicht als Task-Eingabe registriert und beeinträchtigt das Caching
Shrinker (R8)
Die optimierte Entfernung von Ressourcen durch R8 schlägt ohne Fehlermeldung fehl, wenn endgültige Ressourcen-IDs verwendet werden