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 tabeli poniżej podano, kiedy interfejsy AGP zostały wycofane i usunięte (w ujęciu wersji AGP).

Interfejs API Wycofane w wersji AGP Usunięto z wersji AGP
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
Transformacja 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.

Interfejs Transform API jest usuwany, aby zwiększyć wydajność kompilacji. 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 też używać interfejsu Transform API i łączyć go z innymi funkcjami Gradle. Zastępujące interfejsy API mają ułatwić rozszerzanie interfejsu AGP bez wprowadzania problemów z wydajnością lub poprawnoś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 wersji 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 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. Ponadto zmiana w pojedynczej klasie oznacza, że tylko te klasy, których dotyczy zmiana, muszą zostać ponownie zaimplementowane w wersji przyrostowej. Przykład użycia interfejsu Instrumentation API znajdziesz w recepcie AGP Przekształcanie 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 recepcie 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. Należy stosować to podejście ostrożnie, ponieważ wiąże się ono z znacznie wyższym kosztem wydajności kompilacji niż korzystanie z interfejsu Instrumentacji. 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 programistycznych.

Aby zarejestrować zadanie, które przekształca wszystkie klasy razem, w wersji 7.4 wtyczki Androida do obsługi 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ą funkcji Artifacts.forScope.ALL zarejestrować zadanie, które przekształca wszystkie klasy:

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 obsługiwany przez żaden z interfejsów API AndroidComponents, 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). Asystent uaktualniania AGP pomoże też deweloperom projektów w aktualizowaniu najczęściej używanych wtyczek w razie potrzeby.

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 AGP 8.0.

AGP 7.2

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

RenderScript został wycofany

Od wersji AGP 7.2 interfejsy RenderScript API są wycofywane. 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 Przechodzenie 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
          )
      })
  }