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

Auf dieser Seite werden die Einstellung und Entfernungen der Android Gradle Plugin API (AGP) sowie Informationen dazu, wie Sie Ihren Code entsprechend aktualisieren können.

Tracker für eingestellte und entfernte APIs

In der folgenden Tabelle ist zusammengefasst, wann AGP APIs eingestellt und entfernt werden: der AGP-Version.

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

8.0 AGP

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

Transform API entfernt

Ab AGP 8.0 wird das Transformieren API wurde entfernt. Das bedeutet, dass alle Klassen im Paket com.android.build.api.transform wurden entfernt.

Die Transform API wird entfernt, um die Build-Leistung zu verbessern. Projekte, die Transform API erzwingen, dass AGP einen weniger optimierten Ablauf für den Build verwendet, kann dies zu erheblichen Verkürzungen der Build-Zeiten führen. Außerdem ist es schwierig, Transform API zu erstellen und mit anderen Gradle-Features zu kombinieren. die Ersatz-APIs Es soll einfacher sein, den AGP ohne Leistungseinbußen oder Entwicklung Korrektheit der Antworten.

Ersatz-APIs

Es gibt keinen einzigen Ersatz für die Transform API – es gibt neue, zielgerichtete APIs für jeden Anwendungsfall Alle Ersatz-APIs befinden sich im Block androidComponents {}. Diese APIs sind alle bis zum AGP 7.2 verfügbar.

Unterstützung für die Transformation von Bytecode

Verwenden Sie zum Transformieren von Bytecode die Instrumentation API. Für Bibliotheken haben Sie folgende Möglichkeiten: Instrumentierungen nur für lokale Projektklassen registrieren für Apps und Tests, kannst du eine Instrumentierung nur für lokale Kurse oder für alle einschließlich lokaler und Remote-Abhängigkeiten. Um diese API zu verwenden, die Instrumentierung in jeder Klasse unabhängig ausgeführt wird, mit eingeschränktem Zugriff auf andere Klassen im classpath (siehe createClassVisitor() . Durch diese Einschränkung wird die Leistung von vollständige und inkrementelle Builds erstellen und die API-Oberfläche einfach halten. Jede Bibliothek und wird parallel eingesetzt, sobald sie bereit ist, ist abgeschlossen. Darüber hinaus kann eine Änderung in einem einzelnen Kurs bedeutet, dass nur betroffene Klassen schrittweise neu instrumentiert werden müssen erstellen. Beispiele für die Verwendung der Instrumentation API finden Sie auf der Klassen mit ASM transformieren AGP-Rezept.

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

Um der App zusätzliche generierte Klassen hinzuzufügen, verwenden Sie die Artefakte 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 zu den Projektklassen. Die Artifacts API wählt automatisch an einen eindeutigen Speicherort für die Ausgabe Ihrer benutzerdefinierten Aufgabe. Weitere Informationen finden Sie in der addToAllclass-Rezept finden Sie ein Beispiel für die Verwendung dieser API.

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

Um Transformationen zu implementieren, die auf der Analyse des gesamten Programms basieren, können alle Klassen in einer Aufgabe transformiert werden. Dieser Ansatz sollte mit Vorsicht angewendet werden da die Build-Leistung wesentlich höher ist als bei Verwendung der Instrumentierung der API erstellen. Wenn Ihr Plug-in diese API verwendet, wird empfohlen, die Transformation muss für jeden Build-Typ aktiviert sein, damit der App-Entwickler sie für Entwicklungs-Builds.

Zum Registrieren einer Aufgabe, die alle Klassen zusammen transformiert, müssen Sie das Android-Gradle-Plug-in 7.4 stellt den Artifacts.forScope (Artefakte.forScope) der API erstellen. Verwenden Sie zum Transformieren aller Klassen im aktuellen Projekt den Artifacts.forScope.PROJECT Um alle Klassen im aktuellen Projekt zu transformieren, importierten Projekten und allen externen Abhängigkeiten verwenden Sie Artifacts.forScope.ALL. Der folgende Code zeigt, wie Sie mit Artifacts.forScope.ALL einen -Aufgabe, die alle Klassen zusammen transformiert:

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

Weitere Informationen finden Sie in der modifyProjectMembers-Schema finden Sie ein Beispiel für die Verwendung dieser API. Rezept anpassenAgpDsl .

Wird Ihr Anwendungsfall von keinem der Android-Komponenten APIs, melden Sie den Fehler.

Mehrere häufig verwendete Plug-ins wurden bereits migriert, um diese neuen APIs zu verwenden. einschließlich des Firebase Performance Monitoring-Plug-ins (1.4.1 ist kompatibel mit AGP 8.0) und das Hilt Gradle-Plug-in (2.40.1 ist mit AGP 8.0 kompatibel). AGP Der Upgrade-Assistent unterstützt auch Projektentwickler beim Upgrade gängiger Plug-ins nach Bedarf ein.

Wenn Sie die Transform API über ein Drittanbieter-Plug-in verwenden, Autor wissen, dass ihr Plug-in aktualisiert werden muss, damit sie mit den neuen APIs kompatibel sind. für AGP 8.0.

7.2 AGP

Im Folgenden finden Sie wichtige API-Updates zu AGP 7.2.

RenderScript wurde eingestellt

Ab AGP 7.2 werden die RenderScript APIs eingestellt. Sie werden weiterhin bis zum Funktionieren, aber das Auslösen von Warnungen, und wird in Zukunft vollständig entfernt. Versionen von AGP. Eine Anleitung zum Wechsel von RenderScript finden Sie unter Migration von RenderScript

Component.transformClassesWith und Component.setAsmFramesComputationMode wurden eingestellt

Ab AGP 7.2 bieten die Klassen-Bytecode-Instrumentierungs-APIs Component.transformClassesWith und Component.setAsmFramesComputationMode wurden verworfen. Sie wurden in den neuen Block Component.instrumentation verschoben, enthält alle APIs für die Konfiguration des Instrumentierungsprozesses. Bis diese Instrumentierungsfunktionen weiter nutzen, nutzen Sie die entsprechenden APIs in in den 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
          )
      })
  }