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

Das Android-Gradle-Plug-in 9.0 ist ein wichtiger Release, der Änderungen an der API und am Verhalten 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, bestehende Verhaltensweisen 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 sind zwei Agenten-Skills verfügbar, die den Upgradeprozess vereinfachen. Wenn Sie eine App ohne KMP verwenden, probieren Sie den AGP 9-Upgrade-Skill aus dem Repository für Android-Skills 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 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, vollständig ausgeblendete Typen umgestellt. 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 Plug-in org.jetbrains.kotlin.android 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. Dies kann komplexer sein, da die androidComponents API 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 den Wechsel zu den 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 Varianten-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 dx-Tool, 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 Option deaktivieren und 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 weiterhin 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 auf AGP 9.0 upgraden. 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 Entwickler häufig verwendeter Plug-ins, um sie bei der Anpassung und Veröffentlichung von Plug-ins zu unterstützen, 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 und aktiviert diese standardmäßig. 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 in 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 Funktion 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 durchführen

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 das integrierte Kotlin deaktiviert haben. Das liegt daran, dass in AGP 9.0 das integrierte Kotlin standardmäßig aktiviert ist und für das integrierte Kotlin KGP 2.2.10 oder höher erforderlich ist.

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 Unterstützung der Android Studio-IDE 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 sich Ihre Nutzer leichter auf Ihre veröffentlichten Artefakte verlassen.

Informationen zu den ersten Schritten finden Sie unter Mehrere Android-Bibliotheken als eine mit Fused Library 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 Wechsel 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ührt standardmäßig On-Device-Tests mit der Klasse androidx.test.runner.AndroidJUnitRunner aus und ersetzt 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 Anwendungstests (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 an der Quelle übernehmen. Wenn die Felder der R-Klasse an einer Stelle verwendet werden, die eine Konstante erfordert, z. B. in Switch-Anweisungen, refaktoriere sie, um verkettete If-Anweisungen zu verwenden.
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. Bisher wurden Unit-Tests für das Debugging oder den Release ausgeführt.
false → true Wenn für Ihr Projekt keine Tests sowohl für die Fehlerbehebung als auch für den 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. Legen Sie dazu in den Gradle-Build-Dateien dieser Projekte Folgendes fest:
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 die 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. Entfernen Sie 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 in der Datei „configuration.txt“ (normalerweise unter einem Pfad wie <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) nach Kommentaren wie # REMOVED CONSUMER RULE: ­dontoptimize suchen, um zu sehen, wann dies der Fall ist. false → true In veröffentlichten Bibliotheken sollten alle inkompatiblen Regeln entfernt werden. In internen Bibliotheken sollten inkompatible, aber erforderliche Regeln stattdessen in eine proguardFile in einem App-Modul verschoben werden. Sie können die Funktion deaktivieren, 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 Pfad des Shader-Compilers 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 dies in Google Play nicht mehr unterstützt wird. 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 basierend auf der Pixeldichte mit AGP 9.0 oder höher 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 angewiesen zu sein:

    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

Mit dem Android-Gradle-Plug-in 9.0 werden folgende Elemente entfernt:

Entfernte APIs

Mit dem Android-Gradle-Plug-in 9.0 werden 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 es Renderscript-Quellen gibt. Legen Sie dazu in den Gradle-Build-Dateien dieser Projekte das folgende Attribut fest:
android {
  buildFeatures {
    renderScript = true
  }
}

Erzwungene Gradle-Properties

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. Eine 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 Beibehaltungsregeln 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 Optimierung nicht zulassen und Shrinking nicht zulassen auf die Companion-Methoden wurde zuvor der folgende Anwendungsfall unterstützt:

  1. Kompiliere 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. So umgehen Sie das Problem:

  1. Desugaring der Bibliothek mit default/static/private-Schnittstellenmethoden zu 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äßige 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 Quelldateiattribut 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 die Option android.enableR8.fullMode=false enthält) wird das Quellcodedatei-Attribut 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 7-stelliges Präfix des zuvor verwendeten Karten-Hashs.

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 der synthetischen Klasse auch die Art der synthetischen Klasse 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 Kursname 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 Keep-Datei des Nutzers „-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 Module 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 das Navigationsdiagramm 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‘ ist veraltet“ fehl.
Die integrierte Kotlin-Version kann die nicht versionierte kotlin-stdlib nicht auflösen, wenn kotlin.stdlib.default.dependency=false ist.
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 reinen Testmodulen
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 Annotationsverarbeitung.
compileSdkSpec.minorApiLevel funktioniert nicht mit SettingsExtension
[fused lib - public] Generierte zusammengeführte Bibliothek enthält keine Quellen
„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
Entfernung von „Installation.installOptions()“ in AGP 9.0
„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
Ändern Sie den Standardwert für „targetSdk“ der App so, dass er auf „compileSdk“ statt auf „minSdk“ basiert.
Wenn „isIncludeAndroidResources“ aktiviert ist, schlägt das Zusammenführen von „tools:overrideLibrary“-Nutzungen 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“ setzen
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 aktualisiert
KotlinJvmAndroidCompilation mit der KGP API erstellen
Expliziter API-Modus von Kotlin 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 nicht „.kotlin_module“ hinzu
Der Lint-Klassenpfad enthält doppelte Klassen in verschiedenen Versionen
Problemumgehung zum Ü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 unterbricht das Caching
Shrinker (R8)
Die optimierte Entfernung von Ressourcen durch R8 schlägt ohne Fehlermeldung fehl, wenn endgültige Ressourcen-IDs verwendet werden