Aktualizacje interfejsu API wtyczki Androida do obsługi Gradle

Na tej stronie znajdziesz informacje o wycofywaniu i usuwaniu interfejsów API wtyczki Androida do obsługi Gradle (AGP) oraz o tym, jak odpowiednio zaktualizować kod.

Narzędzie do śledzenia wycofanych i usuniętych interfejsów API

W tabeli poniżej znajdziesz podsumowanie informacji o tym, kiedy interfejsy API AGP są wycofywane i usuwane, w zależności od wersji AGP.

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

AGP 8.12

Wtyczka Androida do obsługi Gradle w wersji 8.12.0 zawiera te ważne zmiany w interfejsie API.

Zmiana działania: opcja includeAndroidResources scala plik manifestu z katalogu testowego

Możesz teraz utworzyć plik AndroidManifest.xml w testowym katalogu źródłowym, aby dostosować plik manifestu do testów jednostkowych za pomocą opcji android.testOptions.unitTests.includeAndroidResources. Plik manifestu testowego zostanie scalony z głównym plikiem manifestu aplikacji. Problem 127986458

AGP 8.10

Wtyczka Androida do obsługi Gradle w wersji 8.10.0 zawiera te ważne zmiany w interfejsie API.

Zmiana powodująca niezgodność na poziomie źródła: finalizeDsl wymaga teraz użycia typów sparametryzowanych

Aby umożliwić używanie AndroidComponentsExtension bezpośrednio z wtyczką com.android.kotlin.multiplatform.library, złagodzono ograniczenie typu w finalizeDsl.

Jeśli na przykład używasz nieprzetworzonych typów AndroidComponentsExtension do adresowania aplikacji i bibliotek:

extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
  androidExtension.experimentalProperties["android.example"] = true
}

Przed uaktualnieniem lub w jego trakcie musisz dostosować kod źródłowy do czegoś takiego:

extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
  androidExtension.experimentalProperties["android.example"] = true
}

Pamiętaj, że jeśli chcesz napisać kod finalizeDsl, który będzie działać zarówno z obecnymi wtyczkami com.android.library i com.android.application, jak i z nową wtyczką com.android.kotlin.multiplatform.library, może być konieczne sprawdzenie typów w czasie działania:

extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
  when(androidExtension) {
    is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
    is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
  }
}

Jest to zmiana powodująca niezgodność tylko na poziomie źródła i nie wpłynie na wtyczki binarne.

AGP 8.8

Poniżej znajdziesz ważne aktualizacje interfejsu API dotyczące wtyczki Androida do obsługi Gradle w wersji 8.8.

Konfiguracje zasobów zostały wycofane

Konfiguracje zasobów zostały wycofane w 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ć ustawienia regionalne obsługiwane przez aplikację za pomocą localeFilters DSL, aby zmapować konfiguracje ustawień regionalnych na odpowiednie zasoby.

AGP 8.0

Poniżej znajdziesz ważne aktualizacje interfejsu API dotyczące wtyczki Androida do obsługi Gradle w wersji 8.0.

Interfejs Transform API został usunięty

Od wersji 8.0 wtyczki Androida do obsługi Gradle interfejs Transform API został usunięty. Oznacza to, że wszystkie klasy w pakiecie com.android.build.api.transform zostaną usunięte.

Interfejs Transform API został usunięty, aby zwiększyć wydajność kompilacji. Projekty, które używają interfejsu Transform API, wymuszają na AGP używanie mniej zoptymalizowanego przepływu kompilacji, co może prowadzić do znacznego wydłużenia czasu kompilacji. Trudno jest też używać interfejsu Transform API i łączyć go z innymi funkcjami Gradle. Interfejsy API, które go zastępują, mają ułatwić rozszerzanie AGP bez powodowania problemów z wydajnością lub poprawnością kompilacji.

Zastępcze interfejsy API

Nie ma jednego interfejsu API, który zastąpi Transform API – dla każdego przypadku użycia są nowe, ukierunkowane interfejsy API. Wszystkie zastępcze interfejsy API znajdują się w bloku androidComponents {}. Wszystkie te interfejsy API są dostępne w 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 klas projektów lokalnych. W przypadku aplikacji i testów możesz zarejestrować instrumentację tylko dla klas lokalnych lub wszystkich klas, w tym zależności lokalnych i zdalnych. Aby korzystać z tego interfejsu API, instrumentacja jest uruchamiana niezależnie w każdej klasie, z ograniczonym dostępem do innych klas w ścieżce klasy (więcej informacji znajdziesz w artykule createClassVisitor()). To ograniczenie poprawia wydajność zarówno pełnych, jak i przyrostowych kompilacji oraz 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 ramach kompilacji przyrostowej trzeba ponownie zinstrumentować tylko klasy, których dotyczy zmiana. Przykład użycia interfejsu Instrumentation API znajdziesz w przepisie AGP Przekształcanie klas za pomocą ASM.

obsługę dodawania wygenerowanych klas do aplikacji;

Aby dodać do aplikacji dodatkowe wygenerowane klasy, użyj interfejsu Artifacts API z MultipleArtifact.ALL_CLASSES_DIRS. Więcej szczegółów:

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ę, w której zadanie niestandardowe będzie zapisywać dane wyjściowe. Przykład użycia tego interfejsu API znajdziesz w przepisie addToAllClasses.

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

Aby wdrożyć przekształcenia na podstawie analizy całego programu, wszystkie klasy można przekształcić razem w ramach jednego zadania. Z tego podejścia należy korzystać ostrożnie, ponieważ ma ono znacznie wyższy koszt wydajności kompilacji niż korzystanie z interfejsu Instrumentation API. Jeśli Twoja wtyczka używa tego interfejsu API, zalecamy, aby przekształcenie było opcjonalne w przypadku każdego typu kompilacji, dzięki czemu deweloper aplikacji będzie mógł je wyłączyć w kompilacjach deweloperskich.

Aby zarejestrować zadanie, które przekształca wszystkie klasy razem, wtyczka Androida do obsługi Gradle w wersji 7.4 wprowadza interfejs API Artifacts.forScope. Aby przekształcić wszystkie klasy w bieżącym projekcie, użyj Artifacts.forScope.PROJECT. Aby przekształcić wszystkie klasy w bieżącym projekcie, zaimportowanych projektach i wszystkich zewnętrznych zależnościach, użyj Artifacts.forScope.ALL. Poniższy kod pokazuje, jak używać Artifacts.forScope.ALL do rejestrowania zadania, 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 przepisie modifyProjectClasses, a przykład rejestrowania niestandardowych rozszerzeń w typach kompilacji Androida – w przepisie customizeAgpDsl.

Jeśli Twój przypadek użycia nie jest obsługiwany przez żaden z interfejsów API AndroidComponents, możesz zgłosić błąd.

Kilka często używanych wtyczek zostało już przeniesionych do tych nowych interfejsów API, w tym wtyczka do monitorowania skuteczności w Firebase (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 aktualizacji przy użyciu wtyczki Androida do obsługi Gradle pomoże też deweloperom projektów w razie potrzeby uaktualnić często używane wtyczki.

Jeśli używasz interfejsu Transform API za pomocą wtyczki innej firmy, możesz poinformować jej autora, że trzeba będzie ją zaktualizować, aby działała z nowymi interfejsami API w AGP 8.0.

AGP 7.2

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

RenderScript został wycofany

Od wersji AGP 7.2 interfejsy RenderScript API są wycofane. Będą nadal działać, ale będą wywoływać ostrzeżenia, a w przyszłych wersjach AGP zostaną całkowicie usunięte. Wskazówki dotyczące migracji z RenderScript znajdziesz w artykule Migracja z RenderScript.

Component.transformClassesWith i Component.setAsmFramesComputationMode zostały wycofane

Począwszy od wtyczki Androida do obsługi Gradle w wersji 7.2, interfejsy API instrumentacji 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 instrumentacji. Aby nadal korzystać z tych funkcji instrumentacji, 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
          )
      })
  }