API-Updates für das Android Gradle-Plug-in

Auf dieser Seite wird beschrieben, wie Sie die API des Android Gradle-Plug-ins (AGP) einstellen und entfernen. Außerdem erhalten Sie Informationen dazu, wie Sie Ihren Code entsprechend aktualisieren.

Tracker für Einstellungen und Entfernungen von APIs

In der folgenden Tabelle wird in Bezug auf die AGP-Version zusammengefasst, wann AGP APIs 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.0

Im Folgenden finden Sie wichtige API-Updates für AGP 8.0.

Transform API wurde entfernt

Ab AGP 8.0 wurde 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. Projekte, die die Transform API nutzen, zwingen AGP dazu, einen weniger optimierten Ablauf für den Build zu verwenden, was zu großen Regressionen bei den Build-Zeiten führen kann. Außerdem ist es schwierig, die Transform API zu verwenden und mit anderen Gradle-Funktionen zu kombinieren. Mit den Ersatz-APIs soll die Erweiterung von AGP ohne Leistungs- oder Build-Richtigkeitsprobleme vereinfacht werden.

Ersatz-APIs

Die Transform API kann nicht einzeln ersetzt werden. Für jeden Anwendungsfall gibt es neue, zielgerichtete 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 entweder nur für lokale Klassen oder für alle Klassen, einschließlich lokaler und Remote-Abhängigkeiten, registrieren. Zur Verwendung dieser API wird die Instrumentierung für jede Klasse unabhängig und mit eingeschränktem Zugriff auf andere Klassen im Klassenpfad ausgeführt (siehe createClassVisitor() für weitere Informationen). Diese Einschränkung verbessert die Leistung sowohl vollständiger als auch inkrementeller Builds und sorgt für eine einfache API-Oberfläche. Jede Bibliothek wird parallel instrumentiert, sobald sie bereit ist, und nicht nach Abschluss der gesamten Kompilierung. Außerdem bedeutet eine Änderung in einer einzelnen Klasse, dass nur betroffene Klassen in einem inkrementellen Build neu instrumentiert werden müssen. Eine Anleitung zur Verwendung der Instrumentation API finden Sie im AGP-Schema Klassen mit ASM transformieren.

Unterstützung für das Hinzufügen generierter Klassen zu Ihrer App

Wenn Sie der App weitere 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 zusätzliche generierte Verzeichnisse an die Projektklassen 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 Rezept für addToAllClasses.

Unterstützung für Transformationen auf der Grundlage der gesamten Programmanalyse

Zum Implementieren von Transformationen auf der Grundlage der gesamten Programmanalyse können alle Klassen zusammen in einer einzigen Aufgabe transformiert werden. Dieser Ansatz sollte mit Vorsicht verwendet werden, da die Kosten für die Build-Leistung viel höher sind als die Verwendung der Instrumentation API. Wenn Ihr Plug-in diese API verwendet, sollte die Transformation für jeden Build-Typ aktiviert sein, damit der App-Entwickler sie für Entwicklungs-Builds deaktivieren kann.

Zum Registrieren einer Aufgabe, 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. Verwenden Sie Artifacts.forScope.ALL, um alle Klassen im aktuellen Projekt, importierte Projekte und alle externen Abhängigkeiten zu transformieren. 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 ModifyProjectClasses-Schema. Im customizeAgpDsl-Rezept finden Sie ein Beispiel zum Registrieren benutzerdefinierter Erweiterungen bei den Android-Build-Typen.

Wenn Ihr Anwendungsfall von keiner der AndroidComponents APIs abgedeckt wird, melden Sie den Fehler.

Einige häufig verwendete Plug-ins wurden bereits zur Verwendung dieser neuen APIs migriert. Dazu gehören das Firebase-Plug-in zur Leistungsüberwachung (1.4.1 ist mit AGP 8.0 kompatibel) und das Hilt Gradle-Plug-in (2.40.1 ist mit AGP 8.0 kompatibel). Mit dem AGP-Upgradeassistenten können Projektentwickler auch häufig verwendete Plug-ins nach Bedarf aktualisieren.

Wenn Sie die Transform API über das Plug-in eines Drittanbieters verwenden, teilen Sie dem Autor mit, dass dessen 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 wurde eingestellt

Ab AGP 7.2 werden die RenderScript APIs eingestellt. Sie funktionieren weiterhin, lösen jedoch Warnungen aus und werden in zukünftigen AGP-Versionen vollständig entfernt. Eine Anleitung zum Wechsel von RenderScript finden Sie unter Von RenderScript migrieren.

Component.transformClassesWith und Component.setAsmFramesComputationMode wurden eingestellt

Ab AGP 7.2 werden die APIs Component.transformClassesWith und Component.setAsmFramesComputationMode für die Klassen-Bytecode-Instrumentierung eingestellt. Sie wurden in einen neuen Block namens Component.instrumentation verschoben, der alle APIs für die Konfiguration des Instrumentierungsprozesses enthält. Wenn Sie diese Instrumentierungsfunktionen weiterhin nutzen 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
          )
      })
  }