Aktualizacje interfejsu API wtyczki Androida do obsługi Gradle

Na tej stronie znajdziesz informacje o wycofaniu i usuwaniu wtyczki Android Gradle (AGP) na interfejs API oraz zawiera informacje o tym, jak odpowiednio zaktualizować kod.

Śledzenie wycofania i usuwania interfejsów API

W tej tabeli podsumowujemy, kiedy interfejsy API AGP są wycofywane i usuwane w wersji AGP.

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

AGP 8.0

Poniżej znajdziesz ważne aktualizacje interfejsu API AGP 8.0.

Interfejs Transform API został usunięty

Począwszy od AGP 8.0, Przekształć Interfejs API został usunięty. Oznacza to, że wszystkie zajęcia w pakiecie Usunięto com.android.build.api.transform.

Interfejs Transform API jest usuwany, aby zwiększyć wydajność kompilacji. Projekty, które użyj interfejsu Transform API force AGP, aby użyć mniej zoptymalizowanego przepływu w kompilacji, która może spowodować duże opóźnienia w czasie kompilacji. Trudno jest też używać Transform API i połączyć go z innymi funkcjami Gradle, nowe interfejsy API ułatwienie rozszerzenia AGP bez zwiększania wydajności problemy ze zgodnością.

Zapasowe interfejsy API

Nie ma jednego zamienników interfejsu Transform API – Interfejsy API do każdego przypadku użycia. Wszystkie zastępcze interfejsy API znajdują się 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 rejestrować narzędzia tylko na potrzeby lokalnych zajęć związanych z projektami; na potrzeby aplikacji i testów, możesz zarejestrować instrumentację tylko dla lokalnych zajęć albo dla wszystkich klas, w tym zależności lokalnych i zdalnych. Aby użyć tego interfejsu API, narzędzia działają niezależnie na poszczególnych zajęciach, z ograniczonym dostępem do pozostałych, klas w ścieżce zajęć (zobacz createClassVisitor() ). To ograniczenie poprawia skuteczność w kompilacji pełnych i przyrostowych, a interfejs API jest prosty. Każda biblioteka jest konfigurowany równolegle, gdy tylko jest gotowy, kompilacja ukończona. Oprócz tego zmiana w jednych zajęciach co oznacza, że tylko klasy, których dotyczy problem, muszą być przyporządkowane tworzyć. Aby dowiedzieć się, jak korzystać z interfejsu Instrumentation API, zapoznaj się z Przekształcanie klas za pomocą ASM Przepis AGP.

Obsługa dodawania wygenerowanych zajęć do aplikacji

Aby dodać do aplikacji kolejne wygenerowane zajęcia, użyj Artefakty Interfejs API z MultipleArtifact.ALL_CLASSES_DIRS. W szczególności użyj

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

z MultipleArtifact.ALL_CLASSES_DIRS, aby dołączyć wygenerowane dodatkowe do klas projektu. Interfejs Artifacts API wybierze automatycznie w unikalnej lokalizacji zadania niestandardowego, w której będzie trafiać dane wyjściowe. Zobacz przepis addToAllClasses .

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

Aby wdrożyć przekształcenia na podstawie analizy całego programu, wszystkie zajęcia można połączone w jedno zadanie. Z tej metody należy korzystać z rozwagą. ponieważ koszt tworzenia jest znacznie wyższy niż w przypadku narzędzi API. Jeśli wtyczka korzysta z tego interfejsu API, zalecamy przekształcenie wyrazić zgodę dla danego typu kompilacji, tak aby deweloper aplikacji mógł ją wyłączyć i tworzenia aplikacji.

Aby zarejestrować zadanie, które przekształca wszystkie zajęcia, wtyczka Androida do obsługi Gradle w wersji 7.4 przedstawia Artifacts.forScope API. Aby przekształcić wszystkie zajęcia w bieżącym projekcie, użyj funkcji Artifacts.forScope.PROJECT Aby przekształcić wszystkie zajęcia w bieżącym projekcie: zaimportowanych projektów i wszystkich zależności zewnętrznych używają Artifacts.forScope.ALL. Ten kod pokazuje, jak za pomocą Artifacts.forScope.ALL zarejestrować zadanie, które przekształca wszystkie zajęcia:

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

Zobacz przepis modifyProjectClasses , gdzie znajdziesz przykład korzystania z tego interfejsu API. Przepis na dostosowanie AgpDsl .

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

Kilka popularnych wtyczek zostało już przeniesionych, aby korzystać z tych nowych interfejsów API, oraz wtyczkę do monitorowania wydajności Firebase (wersja 1.4.1 jest zgodna z AGP 8.0) i wtyczki Hilt Gradle (wersja 2.40.1 jest zgodna z formatem AGP 8.0). AGP Asystent uaktualniania pomoże też programistom projektów uaktualnić często używane usługi w razie potrzeby wtyczki.

Jeśli używasz interfejsu Transform API za pomocą wtyczki innej firmy, udostępnij autor wie, że jego wtyczka będzie musiała zostać zaktualizowana, aby działała z nowymi interfejsami API w przypadku standardu AGP 8.0.

AGP 7.2

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

Interfejs RenderScript został wycofany

W AGP 7.2 interfejsy RenderScript API są wycofane. Będą kontynuowane nie działać, ale wywoływać ostrzeżenia i w przyszłości zostanie całkowicie usunięte wersji AGP. Aby uzyskać wskazówki dotyczące wyłączania obsługi RenderScript, zobacz Migracja z języka RenderScript

Interfejs Component.transformClassesWith i Component.setAsmFramesComputationMode zostały wycofane

Począwszy od AGP 7.2, interfejsy API instrumentacji kodu bajtowego klasy Component.transformClassesWith i Wycofano Component.setAsmFramesComputationMode. Przenieśli się do nowego bloku, Component.instrumentation, zawiera wszystkie interfejsy API związane z konfigurowaniem procesu instrumentacji. Do nadal korzystać z tych funkcji instrumentacji, użyj odpowiednich interfejsów API jak widać 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
          )
      })
  }