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 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 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.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
)
})
}