Auf dieser Seite werden die Einstellungen und Entfernungen von Android Gradle-Plug-in-APIs (AGP) aufgeführt. Außerdem finden Sie hier Informationen dazu, wie Sie Ihren Code entsprechend aktualisieren.
Tracker für die Einstellung und Entfernung von APIs
In der folgenden Tabelle ist zusammengefasst, wann AGP APIs in Bezug auf die AGP-Version eingestellt und entfernt werden.
| API | In AGP-Version verworfen | Aus AGP-Version entfernt |
|---|---|---|
Component.setAsmFramesComputationMode |
7.2 | |
Component.transformClassesWith |
7.2 | |
| RenderScript | 7.2 | |
| Transformieren | 7.2 | 8.0 |
AGP 8.12
Das Android-Gradle-Plug-in 8.12.0 enthält die folgenden wichtigen API-Änderungen.
Verhaltensänderung: Mit der Option includeAndroidResources wird das Manifest aus dem Testverzeichnis zusammengeführt
Sie können jetzt eine AndroidManifest.xml-Datei in Ihrem Testquellverzeichnis erstellen, um das Manifest für Unit-Tests mit der Option android.testOptions.unitTests.includeAndroidResources anzupassen. Die Testmanifestdatei wird mit dem Hauptmanifest der App zusammengeführt. Problem Nr. 127986458
AGP 8.10
Das Android-Gradle-Plug-in 8.10.0 enthält die folgenden wichtigen API-Änderungen.
Funktionsgefährdende Änderung auf Quellebene: Für finalizeDsl müssen jetzt parametrisierte Typen verwendet werden
Damit AndroidComponentsExtension direkt mit dem com.android.kotlin.multiplatform.library-Plug-in verwendet werden kann, wurde die Typbindung für finalizeDsl gelockert.
Wenn Sie beispielsweise Rohdatentypen von AndroidComponentsExtension verwendet haben, um Anwendungen und Bibliotheken anzusprechen:
extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Sie müssen Ihren Quellcode vor oder während des Upgrades anpassen, z. B. so:
extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
Wenn Sie finalizeDsl-Code schreiben möchten, der sowohl mit den aktuellen com.android.library- und com.android.application-Plug-ins als auch mit dem neuen com.android.kotlin.multiplatform.library-Plug-in funktioniert, müssen Sie die Typen möglicherweise zur Laufzeit prüfen:
extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
when(androidExtension) {
is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
}
}
Dies ist nur eine funktionsgefährdende Änderung auf Quellebene und hat keine Auswirkungen auf binäre Plug-ins.
AGP 8.8
Im Folgenden finden Sie wichtige API-Updates für AGP 8.8.
Ressourcenkonfigurationen wurden eingestellt
Ressourcenkonfigurationen werden seit AGP 8.8 nicht mehr unterstützt. Dies wurde getan, weil das AGP keine unterschiedlichen Ressourcendichten mehr unterstützt und die Google Play Console jetzt erfordert, dass Apps als App-Bundles veröffentlicht werden. Für die Sprachkonfiguration können Sie die von Ihrer App unterstützten Sprachen mit der localeFilters-DSL angeben, um Sprachkonfigurationen den entsprechenden Ressourcen zuzuordnen.
AGP 8.0
Im Folgenden finden Sie wichtige API-Updates für AGP 8.0.
Transform API wurde entfernt
Ab AGP 8.0 wird die Transform API entfernt. Das bedeutet, dass alle Klassen im Paket com.android.build.api.transform entfernt werden.
Die Transform API wird entfernt, um die Build-Leistung zu verbessern. Bei Projekten, die die Transform API verwenden, wird das AGP gezwungen, einen weniger optimierten Ablauf für den Build zu verwenden. Das kann zu großen Regressionen bei den Build-Zeiten führen. Außerdem ist es schwierig, die Transform API zu verwenden und mit anderen Gradle-Funktionen zu kombinieren. Die Ersatz-APIs sollen es einfacher machen, das AGP zu erweitern, ohne dass es zu Problemen mit der Leistung oder der Build-Korrektheit kommt.
Ersatz-APIs
Es gibt keinen einzelnen Ersatz für die Transform API. Für jeden Anwendungsfall gibt es neue, gezielte APIs. Alle Ersatz-APIs befinden sich im androidComponents
{}-Block. Diese APIs sind alle ab AGP 7.2 verfügbar.
Unterstützung für die Transformation von Bytecode
Verwenden Sie die Instrumentation API, um Bytecode zu transformieren. Bei Bibliotheken können Sie eine Instrumentierung nur für lokale Projektklassen registrieren. Bei Anwendungen und Tests können Sie eine Instrumentierung nur für lokale Klassen oder für alle Klassen registrieren, einschließlich lokaler und Remote-Abhängigkeiten. Bei dieser API wird die Instrumentierung unabhängig für jede Klasse ausgeführt, wobei der Zugriff auf andere Klassen im Klassenpfad eingeschränkt ist. Weitere Informationen finden Sie unter createClassVisitor().
Diese Einschränkung verbessert die Leistung sowohl von vollständigen als auch von inkrementellen Builds und sorgt für eine optimierte API-Oberfläche. Jede Bibliothek wird parallel instrumentiert, sobald sie bereit ist, und nicht erst, wenn die gesamte Kompilierung abgeschlossen ist. Außerdem bedeutet eine Änderung in einer einzelnen Klasse, dass nur betroffene Klassen in einem inkrementellen Build neu instrumentiert werden müssen. Ein Beispiel für die Verwendung der Instrumentation API finden Sie im AGP-Rezept Transforming classes with ASM.
Unterstützung für das Hinzufügen generierter Klassen zu Ihrer App
Wenn Sie der App zusätzliche generierte Klassen hinzufügen möchten, verwenden Sie die Artifacts API mit MultipleArtifact.ALL_CLASSES_DIRS. Verwenden Sie insbesondere
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
mit MultipleArtifact.ALL_CLASSES_DIRS, um den Projektklassen zusätzliche generierte Verzeichnisse anzuhängen. Die Artifacts API wählt automatisch einen eindeutigen Speicherort für die Ausgabe Ihrer benutzerdefinierten Aufgabe aus. Ein Beispiel für die Verwendung dieser API finden Sie im addToAllClasses-Rezept.
Unterstützung für Transformationen basierend auf der Analyse des gesamten Programms
Wenn Sie Transformationen basierend auf einer Analyse des gesamten Programms implementieren möchten, können alle Klassen zusammen in einer einzigen Aufgabe transformiert werden. Dieser Ansatz sollte mit Vorsicht verwendet werden, da er im Vergleich zur Verwendung der Instrumentation API viel mehr Build-Leistung erfordert. Wenn Ihr Plug-in diese API verwendet, wird empfohlen, die Transformation pro Build-Typ zu aktivieren, damit der App-Entwickler sie für Entwicklungs-Builds deaktivieren kann.
Wenn Sie eine Aufgabe registrieren möchten, die alle Klassen zusammen transformiert, wird mit dem Android-Gradle-Plug-in 7.4 die Artifacts.forScope API eingeführt. Verwenden Sie Artifacts.forScope.PROJECT, um alle Klassen im aktuellen Projekt zu transformieren. Wenn Sie alle Klassen im aktuellen Projekt, in importierten Projekten und in allen externen Abhängigkeiten transformieren möchten, verwenden Sie Artifacts.forScope.ALL. Der folgende Code zeigt, wie Sie mit Artifacts.forScope.ALL eine Aufgabe registrieren, die alle Klassen zusammen transformiert:
variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
.use(taskProvider)
.toTransform(
ScopedArtifact.CLASSES,
ModifyClassesTask::allJars,
ModifyClassesTask::allDirectories,
ModifyClassesTask::output,
)
Ein Beispiel für die Verwendung dieser API finden Sie im Rezept „modifyProjectClasses“. Ein Beispiel für die Registrierung benutzerdefinierter Erweiterungen für die Android-Build-Typen finden Sie im Rezept „customizeAgpDsl“.
Wenn dein Anwendungsfall von keiner der AndroidComponents APIs abgedeckt wird, kannst du einen Fehler melden.
Mehrere häufig verwendete Plug-ins wurden bereits auf diese neuen APIs migriert, darunter das Firebase Performance Monitoring-Plug-in (1.4.1 ist mit AGP 8.0 kompatibel) und das Hilt Gradle-Plug-in (2.40.1 ist mit AGP 8.0 kompatibel). Der AGP-Upgrade-Assistent hilft Projektentwicklern auch dabei, häufig verwendete Plug-ins nach Bedarf zu aktualisieren.
Wenn ihr die Transform API über ein Drittanbieter-Plug-in verwendet, könnt ihr den Entwickler darüber informieren, dass das Plug-in aktualisiert werden muss, damit es mit den neuen APIs für AGP 8.0 funktioniert.
AGP 7.2
Im Folgenden finden Sie wichtige API-Updates für AGP 7.2.
RenderScript wird nicht mehr unterstützt
Ab AGP 7.2 werden die RenderScript APIs eingestellt. Sie funktionieren weiterhin, rufen aber Warnungen auf und werden in zukünftigen Versionen des AGP vollständig entfernt. Eine Anleitung zur Migration von RenderScript finden Sie unter Von RenderScript migrieren.
Component.transformClassesWith und Component.setAsmFramesComputationMode wurden verworfen
Ab AGP 7.2 werden die Bytecode-Instrumentierungs-APIs Component.transformClassesWith und Component.setAsmFramesComputationMode nicht mehr unterstützt. Sie wurden in einen neuen Block, Component.instrumentation, verschoben, der alle APIs zur Konfiguration des Instrumentierungsprozesses enthält. Wenn Sie diese Instrumentierungsfunktionen weiterhin verwenden möchten, verwenden Sie stattdessen die entsprechenden APIs im neuen Block, wie im folgenden Code-Snippet gezeigt:
androidComponents {
onVariants(selector().all(), {
instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
InstrumentationScope.Project) { params ->
params.x = "value"
}
instrumentation.setAsmFramesComputationMode(
COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
)
})
}