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 Artifacts z MultipleArtifact.ALL_CLASSES_DIRS
.
W szczególności:
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
z 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.transformClassesWith
i Component.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
)
})
}