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

Auf dieser Seite werden die Einstellung und Entfernung von APIs des Android Gradle-Plug-ins (AGP) protokolliert. Außerdem finden Sie hier Informationen dazu, wie Sie Ihren Code entsprechend aktualisieren.

Informationen zur Einstellung und Entfernung von APIs

In der folgenden Tabelle wird zusammengefasst, wann AGP-APIs eingestellt und entfernt werden, unter Angabe der AGP-Version.

API In der AGP-Version eingestellt Aus AGP-Version entfernt
Component.setAsmFramesComputationMode 7,2
Component.transformClassesWith 7,2
RenderScript 7,2
Transformieren 7,2 8.0

AGP 8.8

Im Folgenden finden Sie wichtige API-Änderungen für AGP 8.8.

Ressourcenkonfigurationen wurden eingestellt

Ressourcenkonfigurationen werden ab AGP 8.8 nicht mehr unterstützt. Das liegt daran, dass AGP keine unterschiedlichen Ressourcendichten mehr unterstützt und Apps in der Google Play Console jetzt als App-Bundles veröffentlicht werden müssen. Für die Sprachkonfiguration können Sie mit der localeFilters-DSL die von Ihrer App unterstützten Sprachen angeben, um Sprachkonfigurationen den entsprechenden Ressourcen zuzuordnen.

AGP 8.0

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

Transform API wird 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, in denen die Transform API verwendet wird, zwingt AGP dazu, einen weniger optimierten Ablauf für den Build zu verwenden, was zu großen Rückgängen bei den Buildzeiten führen kann. Außerdem ist es schwierig, die Transform API zu verwenden und mit anderen Gradle-Funktionen zu kombinieren. Die Ersatz-APIs sollen es einfacher machen, AGP zu erweitern, ohne Leistungs- oder Buildfehler zu verursachen.

Ersatz-APIs

Es gibt keinen einzelnen Ersatz für die Transform API. Stattdessen gibt es für jeden Anwendungsfall neue, spezifische APIs. Alle Ersatz-APIs befinden sich im Block androidComponents {}. Diese APIs sind 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 Apps 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. Wenn Sie diese API verwenden, wird die Instrumentierung unabhängig für jede Klasse ausgeführt, mit eingeschränktem Zugriff auf andere Klassen im Klassenpfad. Weitere Informationen finden Sie unter createClassVisitor(). 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 erst nach Abschluss der gesamten Kompilierung. Außerdem bedeutet eine Änderung an einer einzelnen Klasse, dass nur die betroffenen Klassen in einem inkrementellen Build neu instrumentiert werden müssen. Ein Beispiel für die Verwendung der Instrumentation API finden Sie im AGP-Rezept Klassen mit ASM transformieren.

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 weitere generierte Verzeichnisse anzuhängen. Die Artifacts API wählt automatisch einen eindeutigen Speicherort für die Ausgabe Ihrer benutzerdefinierten Aufgabe aus. Im Rezept addToAllClasses finden Sie ein Beispiel für die Verwendung dieser API.

Unterstützung für Transformationen auf Grundlage der Analyse des gesamten Programms

Um Transformationen auf der Grundlage einer Analyse des gesamten Programms zu implementieren, können alle Klassen in einer einzigen Aufgabe zusammen transformiert werden. Dieser Ansatz sollte mit Vorsicht verwendet werden, da er deutlich höhere Build-Leistungskosten verursacht als die Verwendung der Instrumentation API. Wenn Ihr Plug-in diese API verwendet, wird empfohlen, die Transformation pro Buildtyp zu aktivieren, damit der App-Entwickler sie für Entwicklungsbuilds deaktivieren kann.

Zum Registrieren einer Aufgabe, die alle Klassen gleichzeitig transformiert, wird im Android Gradle-Plug-in 7.4 die Artifacts.forScope-API eingeführt. Wenn Sie alle Klassen im aktuellen Projekt transformieren möchten, verwenden Sie Artifacts.forScope.PROJECT. Wenn Sie alle Klassen im aktuellen Projekt, importierte Projekte und alle externen Abhängigkeiten transformieren möchten, verwenden Sie Artifacts.forScope.ALL. Im folgenden Code wird gezeigt, wie mit Artifacts.forScope.ALL eine Aufgabe registriert wird, die alle Klassen zusammen transformiert:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

Im Rezept modifyProjectClasses finden Sie ein Beispiel für die Verwendung dieser API. Im Rezept customizeAgpDsl erfahren Sie, wie Sie benutzerdefinierte Erweiterungen für die Android-Buildtypen registrieren.

Wenn Ihr Anwendungsfall nicht durch eine der AndroidComponents-APIs abgedeckt ist, melden Sie bitte einen Fehler.

Mehrere häufig verwendete Plug-ins wurden bereits auf die Verwendung dieser neuen APIs umgestellt, darunter das Firebase-Plug-in für die 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). Der AGP-Upgrade-Assistent hilft Projektentwicklern auch dabei, häufig verwendete Plug-ins bei Bedarf zu aktualisieren.

Wenn Sie die Transform API über ein Drittanbieter-Plug-in verwenden, informieren Sie den Autor bitte darüber, dass sein 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-Änderungen für AGP 7.2.

RenderScript wird eingestellt

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

Component.transformClassesWith und Component.setAsmFramesComputationMode werden nicht mehr unterstützt

Ab AGP 7.2 werden die APIs zur Bytecode-Instrumentierung von Klassen Component.transformClassesWith und Component.setAsmFramesComputationMode eingestellt. Sie wurden in den 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
          )
      })
  }