Aktualizacje interfejsu API wtyczki Androida do obsługi Gradle

Ta strona śledzi wycofanie i usunięcie interfejsów API wtyczki Gradle na Androida (AGP) oraz zawiera informacje o tym, jak zaktualizować kod.

Śledzik wycofanych i usunięte interfejsów API

W poniższej tabeli znajdziesz informacje o wycofywaniu i usuwaniu interfejsów API AGP według wersji AGP.

Interfejs API Wycofane w wersji AGP Usunięto z wersji AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
Przekształć 7.2 z Androidem 8.0

AGP 8.8

Poniżej znajdziesz ważne aktualizacje interfejsu API w wersji AGP 8.8.

Konfiguracje zasobów zostały wycofane

Konfiguracje zasobów zostały wycofane w wersji AGP 8.8. Zrobiliśmy to, ponieważ AGP nie obsługuje już różnych gęstości zasobów, a Konsola Google Play wymaga teraz publikowania aplikacji jako pakietów aplikacji. W przypadku konfiguracji języka możesz określić lokalizacje obsługiwane przez aplikację, używając języka DSL localeFilters do mapowania konfiguracji lokalizacji na odpowiednie zasoby.

AGP 8.0

Poniżej znajdziesz ważne aktualizacje interfejsu API w wersji 8.0.

Usunięcie interfejsu Transform API

Począwszy od wersji AGP 8.0 interfejs API Transform zostanie usunięty. Oznacza to, że wszystkie klasy w pakiecie com.android.build.api.transform zostaną usunięte.

Aby zwiększyć wydajność kompilacji, usuwamy interfejs API Transform. Projekty, które korzystają z interfejsu Transform API, wymuszają na AGP użycie mniej zoptymalizowanego procesu kompilacji, co może spowodować znaczne regresje w czasie kompilacji. Trudno jest też używać interfejsu Transform API i łączyć go z innymi funkcjami Gradle. Zapasowe interfejsy API mają ułatwiać rozszerzanie interfejsu AGP bez wprowadzania problemów z wydajnością czy kompatybilnością kompilacji.

Zastępcze interfejsy API

Nie ma jednego zamiennika interfejsu Transform API. W zależności od przypadku użycia dostępne są nowe, dostosowane do potrzeb interfejsy API. Wszystkie zastępcze interfejsy API są zablokowane w bloku androidComponents {}. Wszystkie te interfejsy API są dostępne w ramach AGP 7.2.

Obsługa przekształcania kodu bajtowego

Aby przekształcić kod bajtowy, użyj interfejsu Instrumentation API. W przypadku bibliotek możesz zarejestrować instrumentację tylko dla lokalnych klas projektu. W przypadku aplikacji i testów możesz zarejestrować instrumentację tylko dla lokalnych klas lub wszystkich klas, w tym tych z zależnościami lokalnymi i zdalnymi. Aby korzystać z tego interfejsu API, instrumentacja działa niezależnie w każdej klasie z ograniczonym dostępem do innych klas w ścieżce klas (więcej informacji znajdziesz w artykule createClassVisitor()). To ograniczenie poprawia wydajność zarówno pełnych, jak i przyrostowych wersji, a także upraszcza interfejs API. Każda biblioteka jest instrumentowana równolegle, gdy tylko jest gotowa, a nie po zakończeniu kompilacji. Dodatkowo zmiana w jednej klasie oznacza, że w kompilacji przyrostowej trzeba ponownie wdrożyć tylko te klasy, których dotyczy problem. Aby dowiedzieć się, jak korzystać z interfejsu Instrumentation API, przeczytaj przepis AGP o przekształcaniu klas za pomocą ASM.

Obsługa dodawania wygenerowanych zajęć do aplikacji

Aby dodać do aplikacji dodatkowe wygenerowane klasy, użyj interfejsu API ArtifactsMultipleArtifact.ALL_CLASSES_DIRS. W szczególności:

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

MultipleArtifact.ALL_CLASSES_DIRS, aby dołączyć dodatkowe wygenerowane katalogi do klas projektu. Interfejs Artifacts API automatycznie wybierze unikalną lokalizację wyjściową dla niestandardowego zadania. Przykład użycia tego interfejsu API znajdziesz w przepisie addToAllClasses.

Obsługa przekształceń na podstawie analizy całego programu

Aby zastosować przekształcenia oparte na analizie całego programu, wszystkie klasy można przekształcić w ramach jednego zadania. Tego podejścia należy używać z rozwagą, ponieważ wiąże się ono ze znacznie wyższymi kosztami kompilacji niż interfejs Instrumentation API. Jeśli Twój wtyczka używa tego interfejsu API, zalecamy, aby przekształcenie było opcjonalne w przypadku każdego typu kompilacji, aby deweloper aplikacji mógł je wyłączyć w przypadku kompilacji przeznaczonych do testów.

Aby zarejestrować zadanie, które przekształca wszystkie klasy razem, w wersji 7.4 wtyczki Androida Gradle wprowadzono interfejs API Artifacts.forScope. Aby przekształcić wszystkie klasy w bieżącym projekcie, użyj opcji Artifacts.forScope.PROJECT. Aby przekształcić wszystkie klasy w bieżącym projekcie, zaimportowane projekty i wszystkie zewnętrzne zależności, użyj Artifacts.forScope.ALL. Ten kod pokazuje, jak za pomocą Artifacts.forScope.ALL zarejestrować zadanie, które przekształca wszystkie klasy razem:

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

Przykład użycia tego interfejsu API znajdziesz w recepcie modifyProjectClasses, a przykład rejestrowania niestandardowych rozszerzeń w typach kompilacji Androida – w recepcie customizeAgpDsl.

Jeśli Twój przypadek użycia nie jest uwzględniony w żadnym z interfejsów API AndroidKomponents, zgłoś błąd.

Kilka często używanych wtyczek zostało już przekształconych, aby korzystać z tych nowych interfejsów API, w tym wtyczka Firebase do monitorowania wydajności (wersja 1.4.1 jest zgodna z AGP 8.0) i wtyczka Hilt Gradle (wersja 2.40.1 jest zgodna z AGP 8.0). W razie potrzeby Asystent uaktualniania AGP pomaga również programistom projektów uaktualniać często używane wtyczki.

Jeśli używasz interfejsu Transform API w ramach wtyczki innej firmy, poinformuj jego autora, że musi on zaktualizować wtyczkę, aby współpracowała z nowymi interfejsami API w wersji 8.0 interfejsu AGP.

AGP 7.2

Poniżej znajdziesz ważne aktualizacje interfejsu API w wersji AGP 7.2.

RenderScript został wycofany

W AGP 7.2 interfejsy RenderScript API są wycofane. Nadal będą działać, ale będą wywoływać ostrzeżenia i w przyszłości zostaną całkowicie usunięte z nowych wersji AGP. Wskazówki dotyczące przejścia z RenderScript znajdziesz w artykule Przenoszenie kodu z RenderScript.

Pole Component.transformClassesWith i pole Component.setAsmFramesComputationMode są wycofane

Od wersji AGP 7.2 interfejsy API do pomiaru kodu bajtowego klasy Component.transformClassesWithComponent.setAsmFramesComputationMode są wycofane. Zostały przeniesione do nowego bloku Component.instrumentation, który zawiera wszystkie interfejsy API związane z konfigurowaniem procesu pomiarowego. Aby nadal korzystać z tych funkcji pomiarowych, użyj odpowiednich interfejsów API w nowym bloku, jak pokazano w tym fragmencie kodu:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }