Wtyczka Androida do obsługi Gradle w wersji 9.0 to wersja główna, która wprowadza zmiany w interfejsie API i zachowaniu.
Aby zaktualizować wtyczkę Androida do obsługi Gradle do wersji 9.0.1, użyj asystenta uaktualniania wtyczki Androida do obsługi Gradle. Asystent uaktualniania AGP pomaga zachować dotychczasowe zachowania podczas uaktualniania projektu, dzięki czemu możesz uaktualnić projekt do wersji AGP 9.0, nawet jeśli nie chcesz jeszcze korzystać ze wszystkich nowych ustawień domyślnych w AGP 9.0.
Dostępne są też 2 umiejętności agenta, które ułatwiają proces uaktualniania. W przypadku aplikacji, która nie jest aplikacją KMP, wypróbuj umiejętność uaktualnienia AGP 9 z repozytorium umiejętności Androida. W przypadku aplikacji KMP wypróbuj umiejętność uaktualnienia AGP 9 od JetBrains. Więcej informacji o korzystaniu z umiejętności w Android Studio znajdziesz w artykule Rozszerzanie trybu agenta za pomocą umiejętności.
Zgodność
Maksymalny poziom interfejsu API obsługiwany przez wtyczkę Androida do obsługi Gradle w wersji 9.0 to poziom 36.1. Inne informacje o zgodności:
| Wersja minimalna | Wersja domyślna | Uwagi | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Więcej informacji znajdziesz w artykule o aktualizowaniu Gradle. |
| Narzędzia do kompilacji pakietu SDK | 36.0.0 | 36.0.0 | Zainstaluj lub skonfiguruj narzędzia SDK do kompilacji. |
| NDK | Nie dotyczy | 28.2.13676358 | Zainstaluj lub skonfiguruj inną wersję NDK. |
| JDK | 17 | 17 | Więcej informacji znajdziesz w artykule o ustawianiu wersji JDK. |
| Wtyczka Kotlin Gradle (KGP) | 2.2.10 | 2.2.10 | Więcej informacji znajdziesz w sekcji Zależność środowiska wykonawczego od wtyczki Kotlin do obsługi Gradle. |
Klasy DSL android implementują teraz tylko nowe interfejsy publiczne
W ciągu ostatnich kilku lat wprowadziliśmy nowe interfejsy dla naszego języka DSL i interfejsu API, aby lepiej kontrolować, które interfejsy API są publiczne. Wersje AGP 7.x i 8.x nadal używały starych typów DSL (np. BaseExtension), które również implementowały nowe interfejsy publiczne, aby zachować zgodność w miarę postępu prac nad interfejsami.
Wtyczka AGP 9.0 używa wyłącznie naszych nowych interfejsów DSL, a implementacje zostały zmienione na nowe typy, które są całkowicie ukryte. Spowoduje to też usunięcie dostępu do starego, wycofanego interfejsu Variant API.
Aby przejść na AGP 9.0, może być konieczne wykonanie tych czynności:
- Upewnij się, że Twój projekt jest zgodny z wbudowanym Kotlinem: wtyczka
org.jetbrains.kotlin.androidnie jest zgodna z nowym DSL. Przełącz projekty KMP na wtyczkę biblioteki Android Gradle do KMP: używanie wtyczki
org.jetbrains.kotlin.multiplatformw tym samym podprojekcie Gradle co wtyczkicom.android.libraryicom.android.applicationjest niezgodne z nowym DSL.Zaktualizuj pliki kompilacji: chociaż zmiana interfejsów ma na celu zachowanie jak największego podobieństwa DSL, mogą wystąpić niewielkie zmiany.
Zaktualizuj niestandardową logikę kompilacji, aby odwoływała się do nowego DSL i interfejsu API: Zastąp wszystkie odwołania do wewnętrznego DSL interfejsami publicznego DSL. W większości przypadków będzie to zastąpienie jeden do jednego. Zastąp wszystkie przypadki użycia interfejsu API
applicationVariantsi podobnych interfejsów API nowym interfejsem APIandroidComponents. Może to być bardziej skomplikowane, ponieważ interfejs APIandroidComponentszostał zaprojektowany tak, aby był bardziej stabilny i zapewniał dłuższą zgodność wtyczek. Przykłady znajdziesz w przepisach na Gradle.Zaktualizuj wtyczki innych firm: niektóre wtyczki innych firm mogą nadal zależeć od interfejsów lub interfejsów API, które nie są już dostępne. Przejdź na wersje tych wtyczek, które są zgodne z AGP 9.0.
Przejście na nowe interfejsy DSL uniemożliwia wtyczkom i skryptom kompilacji Gradle korzystanie z różnych wycofanych interfejsów API, takich jak:
Wycofany interfejs API w bloku android |
Funkcja | Zamiennik |
|---|---|---|
applicationVariants,libraryVariants,testVariants iunitTestVariants
|
Punkty rozszerzeń dla wtyczek, które umożliwiają dodawanie nowych funkcji do AGP. |
Zastąp go interfejsem API androidComponents.onVariants, na przykład:
androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter
|
Umożliwia wyłączenie wybranych wariantów. |
Zastąp go interfejsem API androidComponents.beforeVariants, na przykład:
androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider i testServer
|
Rejestracja niestandardowych środowisk testowych do przeprowadzania testów na urządzeniach z Androidem i emulatorach. | Przełącz się na urządzenia zarządzane przez Gradle. |
sdkDirectory,ndkDirectory,bootClasspath,adbExecutable iadbExe
|
używanie różnych komponentów pakietu Android SDK do niestandardowych zadań; |
Przełącz na androidComponents.sdkComponents.
|
registerArtifactType,registerBuildTypeSourceProvider,registerProductFlavorSourceProvider,registerJavaArtifact,registerMultiFlavorSourceProvider iwrapJavaSourceSet |
Przestarzałe funkcje związane głównie z obsługą wygenerowanych źródeł w Android Studio, które przestały działać w AGP 7.2.0. | Nie ma bezpośredniego zamiennika tych interfejsów API. |
dexOptions
|
Nieaktualne ustawienia związane z narzędziem dx, które zostało zastąpione przez d8. Żadne z ustawień nie działa od wersji 7.0 wtyczki Androida do obsługi Gradle.
|
Nie ma bezpośredniego zamiennika. |
generatePureSplits
|
Generowanie plików split konfiguracji dla aplikacji błyskawicznych. | Możliwość dostarczania podziałów konfiguracji jest teraz wbudowana w pakiety aplikacji na Androida. |
aidlPackagedList
|
Pliki AIDL do spakowania w pliku AAR, aby udostępnić go jako interfejs API dla bibliotek i aplikacji, które zależą od tej biblioteki. |
Nadal jest on widoczny w LibraryExtension, ale nie w przypadku innych typów rozszerzeń.
|
Jeśli po uaktualnieniu do AGP 9.0 pojawi się ten komunikat o błędzie, oznacza to, że projekt nadal odwołuje się do niektórych starych typów:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
Jeśli blokują Cię niezgodne wtyczki innych firm, możesz zrezygnować i przywrócić stare implementacje DSL oraz stary interfejs API wariantów.
W tym czasie dostępne są też nowe interfejsy, a Ty nadal możesz zaktualizować własną logikę kompilacji do nowego interfejsu API. Aby zrezygnować, dodaj ten wiersz do pliku gradle.properties:
android.newDsl=false
Jeśli chcesz przeprowadzić migrację bardziej stopniowo, AGP 9.4 umożliwia wyłączenie poszczególnych modułów. Więcej informacji znajdziesz w sekcji Rezygnacja z modułu Variant API.
Poprzednie klasy są oznaczone jako wycofane we wtyczce Androida do obsługi Gradle 9.0. Oznacza to, że w projektach, które nie korzystają z flagi newDsl, będą wyświetlane ostrzeżenia o wycofaniu, w tym w samym bloku android.
Możesz też zacząć przechodzić na nowe interfejsy API przed uaktualnieniem do wtyczki Androida do obsługi Gradle w wersji 9.0. Nowe interfejsy są dostępne w wielu wersjach AGP, więc możesz mieć kombinację nowych i starych. Dokumentacja interfejsu AGP API zawiera informacje o interfejsie API dla każdej wersji AGP oraz o tym, kiedy dodano poszczególne klasy, metody i pola.
Kontaktujemy się z autorami często używanych wtyczek, aby pomóc im dostosować i wydać wtyczki, które są w pełni zgodne z nowymi trybami. Będziemy też nadal ulepszać asystenta uaktualniania AGP w Android Studio, aby przeprowadzić Cię przez proces migracji.
Jeśli zauważysz, że w nowym interfejsie DSL lub Variant API brakuje funkcji, jak najszybciej zgłoś problem.
Wbudowany język Kotlin
Wtyczka Androida do obsługi Gradle w wersji 9.0 wprowadza wbudowaną obsługę języka Kotlin i domyślnie ją włącza. Oznacza to, że nie musisz już stosować wtyczki org.jetbrains.kotlin.android (ani kotlin-android) w plikach kompilacji, aby kompilować pliki źródłowe Kotlin.
Upraszcza to integrację Kotlina z AGP, pozwala uniknąć używania wycofanych interfejsów API i w niektórych przypadkach zwiększa wydajność.
Dlatego po uaktualnieniu projektu do AGP 9.0 musisz też wykonać migrację na wbudowany język Kotlin lub zrezygnować z tej opcji.
Możesz też wybiórczo wyłączyć wbudowaną obsługę języka Kotlin w przypadku podprojektów Gradle, które nie mają źródeł w języku Kotlin.
Zależność w czasie działania od wtyczki Gradle do obsługi języka Kotlin
Aby zapewnić wbudowaną obsługę języka Kotlin, wtyczka Androida do obsługi Gradle w wersji 9.0 ma teraz zależność środowiska wykonawczego od wtyczki Kotlin do obsługi Gradle (KGP) w wersji 2.2.10. Oznacza to, że nie musisz już deklarować wersji KGP, a jeśli używasz wersji KGP starszej niż 2.2.10, Gradle automatycznie uaktualni ją do wersji 2.2.10. Podobnie, jeśli używasz wersji KSP starszej niż 2.2.10-2.0.2, AGP uaktualni ją do wersji 2.2.10-2.0.2, aby odpowiadała wersji KGP.
Przejście na wyższą wersję KGP
Aby używać wyższej wersji KGP lub KSP, dodaj do pliku kompilacji najwyższego poziomu:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Przejście na niższą wersję KGP
Wersję KGP możesz obniżyć tylko wtedy, gdy zrezygnujesz z wbudowanego języka Kotlin. Dzieje się tak, ponieważ AGP 9.0 domyślnie włącza wbudowany język Kotlin, który wymaga KGP w wersji 2.2.10 lub nowszej.
Aby używać niższej wersji KGP lub KSP, zadeklaruj tę wersję w pliku kompilacji najwyższego poziomu za pomocą deklaracji strict version:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Pamiętaj, że najniższa wersja KGP, do której możesz wrócić, to 2.0.0.
Obsługa zestawów testowych w środowisku IDE
AGP 9.0 zapewnia pełną obsługę zestawów testowych w środowisku IDE Android Studio.
Wtyczka biblioteki połączonej
Wtyczka Fused Library (wersja testowa) umożliwia publikowanie wielu bibliotek jako pojedynczego pliku AAR biblioteki Androida. Dzięki temu użytkownicy mogą łatwiej korzystać z opublikowanych artefaktów.
Więcej informacji o tym, jak zacząć, znajdziesz w artykule Publikowanie wielu bibliotek Androida jako jednej za pomocą biblioteki skonsolidowanej.
Zmiany w zachowaniu
Wtyczka Androida do obsługi Gradle w wersji 9.0 ma te nowe zachowania:
| Zachowanie | Rekomendacja |
|---|---|
Wtyczka Androida do obsługi Gradle w wersji 9.0 domyślnie używa NDK w wersji r28c.
|
Rozważ wyraźne określenie wersji NDK, której chcesz używać. |
| Wtyczka Androida do obsługi Gradle 9.0 domyślnie wymaga, aby użytkownicy biblioteki używali tej samej lub nowszej wersji pakietu SDK do kompilacji. |
Podczas korzystania z biblioteki używaj tego samego lub wyższego pakietu SDK do kompilacji.
Jeśli nie jest to możliwe lub chcesz dać użytkownikom publikowanej przez Ciebie biblioteki więcej czasu na przejście na nową wersję, ustaw AarMetadata.minCompileSdk bezpośrednio.
|
Wtyczka Androida do obsługi Gradle 9.0 zawiera aktualizacje domyślnych wartości tych właściwości Gradle. Dzięki temu możesz zachować działanie wtyczki Androida do obsługi Gradle 8.13 podczas uaktualniania:
| Właściwość | Funkcja | Zmiana z AGP 8.13 na AGP 9.0 | Rekomendacja |
|---|---|---|---|
android. |
Użyj nowych interfejsów DSL bez ujawniania starszych implementacji bloku android.Oznacza to również, że starszy interfejs API wariantów, taki jak android.applicationVariants, nie jest już dostępny.
|
false → true |
Możesz zrezygnować, ustawiając android.newDsl=false.Gdy wszystkie wtyczki i logika kompilacji używane przez projekt będą zgodne, usuń opcję rezygnacji. |
android. |
Włącza wbudowany język Kotlin. | false → true |
Jeśli możesz, wykonaj migrację do wbudowanego języka Kotlin lub zrezygnuj z tej opcji. |
android. |
Wymusza, aby każda biblioteka miała unikalną nazwę pakietu. | false → true |
Określ unikalne nazwy pakietów dla wszystkich bibliotek w projekcie. Jeśli nie jest to możliwe, możesz wyłączyć tę flagę podczas migracji. |
android. |
Domyślnie używaj zależności androidx.
|
false → true |
Zastosuj zależności androidx.
|
android. |
Domyślnie uruchamiaj testy na urządzeniu za pomocą klasy androidx.test.runner.AndroidJUnitRunner, zastępując domyślną wycofaną klasę InstrumentationTestRunner w przypadku
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Zastosuj AndroidJUnitRunner lub wyraźnie określ niestandardowy testInstrumentationRunner.
|
android. |
Kontroluje użycie ograniczeń zależności między konfiguracjami. Domyślna wartość w AGP 9.0 to false, która używa ograniczeń tylko w testach aplikacji na urządzeniu (AndroidTest).
Ustawienie wartości true spowoduje przywrócenie działania z wersji 8.13.
|
true → false |
Nie używaj ograniczeń zależności wszędzie, chyba że są potrzebne. Zaakceptowanie nowej wartości domyślnej tej flagi umożliwia też optymalizację procesu importowania projektu, co powinno skrócić czas importowania kompilacji z wieloma podprojektami biblioteki Androida. |
android. |
Kompilowanie kodu w aplikacjach z użyciem nieostatecznej klasy R, co zapewnia zgodność kompilacji aplikacji z kompilacją biblioteki. Poprawia to przyrostowość i przygotowuje grunt pod przyszłe optymalizacje wydajności procesu przetwarzania zasobów. |
false → true |
W przypadku wielu projektów można po prostu zastosować nowe działanie bez wprowadzania zmian w źródle. Jeśli pola klasy R są używane w miejscach, które wymagają stałej, np. w instrukcjach switch, zmień kod, aby używać instrukcji if. |
android. |
Używa wersji pakietu SDK do kompilacji jako wartości domyślnej docelowej wersji pakietu SDK w aplikacjach i testach. Przed tą zmianą docelowa wersja pakietu SDK była domyślnie ustawiana na minimalną wersję pakietu SDK. |
false → true |
Bezpośrednio określ docelową wersję pakietu SDK dla aplikacji i testów. |
android. |
Tworzy komponenty testów jednostkowych tylko dla testowanego typu kompilacji. W domyślnym projekcie powoduje to utworzenie pojedynczego testu jednostkowego na potrzeby debugowania, podczas gdy wcześniej testy jednostkowe były uruchamiane na potrzeby debugowania lub wersji. |
false → true |
Jeśli Twój projekt nie wymaga przeprowadzania testów zarówno w trybie debugowania, jak i w wersji, nie musisz nic zmieniać. |
android. |
Jeśli którykolwiek z plików do zachowania określonych w AGP DSL nie istnieje na dysku, kompilacja kończy się błędem. Przed tą zmianą literówki w nazwach plików powodowały, że pliki były ignorowane bez powiadomienia. | false → true |
Usuń nieprawidłowe deklaracje plików ProGuard. |
android. |
Umożliwia R8 zachowanie mniejszej liczby zasobów Androida dzięki wspólnemu rozważaniu klas i zasobów Androida. | false → true |
Jeśli reguły przechowywania w projekcie są już kompletne, nie musisz nic zmieniać. |
android. |
Umożliwia R8 zachowanie mniejszej ilości danych przez niejawne niezachowywanie domyślnego konstruktora, gdy klasa jest zachowywana.
Oznacza to, że -keep class A nie oznacza już -keep class A { <init>(); } |
false → true |
Jeśli reguły przechowywania w projekcie są już kompletne, nie musisz nic zmieniać.
Zastąp -keep class A
ciągiem
-keep class A { <init>(); }
w regułach zachowywania projektu we wszystkich przypadkach, w których chcesz zachować konstruktor domyślny.
|
android. |
Włącza resValues we wszystkich podprojektach
|
true → false |
Włącz resValues tylko w tych podprojektach, które tego wymagają, ustawiając w plikach kompilacji Gradle tych projektów:
android {
buildFeatures {
resValues = true
}
} |
android. |
Włącza kompilację obiektów cieniujących we wszystkich podprojektach. | true → false |
Włącz kompilację obiektów cieniujących tylko w podprojektach, które zawierają obiekty cieniujące do skompilowania, ustawiając w plikach kompilacji Gradle tych projektów te wartości:
android {
buildFeatures {
shaders = true
}
} |
android. |
W AGP 9.0 getDefaultProguardFile() będzie obsługiwać tylko proguard-android-optimize.txt, a nie proguard-android.txt. Ma to zapobiec przypadkowemu użyciu flagi dontoptimize, która jest zawarta w proguard-android.txt.
|
false → true |
Jeśli chcesz uniknąć optymalizacji, możesz wyraźnie określić dontoptimize w niestandardowym pliku proguardFile, a także użyć proguard-android-optimize.txt. Jeśli to możliwe, usuń z tego pliku flagę dontoptimize, ponieważ zmniejsza ona korzyści z optymalizacji R8. Jeśli nie, zrezygnuj, ustawiając android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
Od wersji AGP 9.0 publikowanie bibliotek i modułów funkcji na Androida nie powiedzie się, jeśli pliki konsumenta zawierają problematyczne konfiguracje Proguard. Pliki keep konsumenta, które zawierają opcje globalne, takie jak dontoptimize lub dontobfuscate, powinny być używane tylko w modułach aplikacji i mogą zmniejszyć korzyści z optymalizacji dla użytkowników biblioteki. Kompilacja modułu aplikacji na Androida będzie ignorować takie opcje globalne, jeśli są one umieszczone we wstępnie skompilowanej zależności (JAR lub AAR). Możesz sprawdzić, kiedy to nastąpi, sprawdzając plik configuration.txt (zwykle w ścieżce takiej jak <app_module>/build/outputs/mapping/<build_variant>/configuration.txt) pod kątem komentarzy takich jak: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
Z opublikowanych bibliotek należy usunąć wszystkie niezgodne reguły. Biblioteki wewnętrzne powinny przenieść wszystkie niezgodne, ale wymagane reguły do pliku proguardFile w module aplikacji. Aby zrezygnować, ustaw android.r8.globalOptionsInConsumerRules.disallowed=false. Gdy wszystkie pliki Keep użytkowników indywidualnych będą zgodne, usuń opcję rezygnacji.
|
android. |
Zablokuj przekazywanie dostawców dla wygenerowanych źródeł za pomocą DSL AndroidSourceSet.
|
false → true |
Użyj interfejsu API Sources w androidComponents, aby zarejestrować wygenerowane źródła.
|
android. |
Jeśli kompilacja cieniowania jest włączona, ścieżka kompilatora cieniowania musi być wyraźnie ustawiona w local.properties.
|
false → true |
Dodaj glslc.dir=/path/to/shader-tools do pliku local.properties projektu.
|
Usunięte funkcje
Wtyczka Androida do obsługi Gradle w wersji 9.0 usuwa te funkcje:
- Obsługa umieszczonych aplikacji na Wear OS
AGP 9.0 usuwa obsługę umieszczania aplikacji na Wear OS, która nie jest już obsługiwana w Google Play. Obejmuje to usunięcie konfiguracjiwearAppi DSLAndroidSourceSet.wearAppConfigurationName. Informacje o tym, jak opublikować aplikację na Wear OS, znajdziesz w artykule Dystrybucja na Wear OS. androidDependenciesisourceSets– zadanie raportu- Obsługa dzielonych pakietów APK według gęstości
AGP 9.0 usuwa obsługę tworzenia dzielonych pakietów APK na podstawie gęstości ekranu. Funkcja i powiązane interfejsy API zostały usunięte. Aby podzielić pliki APK na podstawie gęstości ekranu za pomocą AGP 9.0 lub nowszego, użyj pakietów aplikacji.
Zmieniony DSL
Wtyczka Androida do obsługi Gradle w wersji 9.0 wprowadza te zmiany powodujące niezgodność w DSL:
Parametryzacja
CommonExtensionzostała usunięta.Sama w sobie jest to tylko zmiana powodująca niezgodność na poziomie źródła, która ma pomóc uniknąć przyszłych zmian powodujących niezgodność na poziomie źródła, ale oznacza to również, że metody blokowania muszą zostać przeniesione z
CommonExtensiondoApplicationExtension,LibraryExtension,DynamicFeatureExtensioniTestExtension.Podczas uaktualniania projektu do AGP 9.0 zrefaktoryzuj kod wtyczki Gradle, który używa tych parametrów lub metod blokowych. Na przykład wtyczka poniżej została zaktualizowana, aby usunąć parametr typu i nie polegać na usuniętych metodach blokowania:
AGP 8.13
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }AGP 9.0
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }W przypadku wtyczek, które są przeznaczone dla różnych wersji AGP, bezpośrednie użycie metody pobierającej jest zgodne binarnie z wersjami AGP starszymi niż 9.0.
Usunięto DSL
Wtyczka Androida do obsługi Gradle w wersji 9.0 usuwa:
AndroidSourceSet.jni, ponieważ nie działała.AndroidSourceSet.wearAppConfigurationName, as it relates to the removed embedded Wear OS app support.BuildType.isRenderscriptDebuggable, ponieważ nie działała.DependencyVariantSelection. Zastępuje goDependencySelection, który jest udostępniany jakokotlin.android.localDependencySelection.Installation.installOptions(String). Zastępuje ją właściwość zmiennaInstallation.installOptions.Eksperymentalny, ale nigdy nieustabilizowany blok
PostProcessing.ProductFlavor.setDimension, który został zastąpiony przez właściwośćdimensionLanguageSplitOptions, który był przydatny tylko w przypadku aplikacji błyskawicznych w Google Play, które zostały wycofane.DensitySplit, ponieważ ta funkcja nie jest już obsługiwana. Zamiast tego należy używać pakietów aplikacji.
Usunięte interfejsy API
Wtyczka Androida do obsługi Gradle w wersji 9.0 usuwa:
AndroidComponentsExtension.finalizeDSl. Zastępuje gofinalizeDsl.Component.transformClassesWith. Zastępuje goInstrumentation.transformClassesWith.Component.setAsmFramesComputationMode. Zastępuje goInstrumentation.setAsmFramesComputationMode.ComponentBuilder.enabled. Zastępuje goComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Zastępuje goincludeInApk.DependenciesInfoBuilder.includedInBundle. Zastępuje goincludeInBundle.GeneratesApk.targetSdkVersion. Zastępuje gotargetSdk.Variant.minSdkVersion. Zastępuje gominSdk.Variant.maxSdkVersion. Zastępuje gomaxSdk.Variant.targetSdkVersion. Zastępuje gotargetSdk.Variant.unitTest, ponieważ nie dotyczyło to wtyczkicom.android.test.unitTestjest dostępny w podtypachVariantBuilderrozszerzającychHasUnitTest.VariantBuilder.targetSdkitargetSdkPreview, ponieważ nie były przydatne w bibliotekach. Zamiast tego użyjGeneratesApkBuilder.targetSdklubGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, ponieważ nie dotyczyło to wtyczkicom.android.test.enableUnitTestjest dostępny w podtypachVariantBuilderrozszerzającychHasUnitTestBuilder.VariantBuilder.unitTestEnabledzostała usunięta na rzecz bardziej spójnej nazwyenableUnitTestw podtypachVariantBuilderrozszerzającychHasUnitTestBuilder.VariantOutput.enable. Zastępuje goenabled.Wycofane i wyłączone
FeaturePluginiFeatureExtension.Wycofane i wyłączone interfejsy API
BaseExtension.registerTransform, które pozostały tylko po to, aby umożliwić kompilowanie z najnowszą wersją AGP, gdy środowisko docelowe działa na AGP 4.2 lub starszej wersji.
Usunięte właściwości Gradle
Poniższe właściwości Gradle zostały początkowo dodane jako sposoby globalnego wyłączania funkcji, które były domyślnie włączone.
Te funkcje są domyślnie wyłączone od wersji AGP 8.0 lub starszej. Aby zwiększyć wydajność kompilacji, włącz te funkcje tylko w podprojektach, które ich używają.
| Właściwość | Funkcja | Zamiennik |
|---|---|---|
android. |
Włącza kompilację AIDL we wszystkich podprojektach. |
Włącz kompilację AIDL tylko w podprojektach, w których znajdują się źródła AIDL, ustawiając tę właściwość w plikach kompilacji Gradle tych projektów:
android {
buildFeatures {
aidl = true
}
} |
android. |
Włącza kompilację RenderScript we wszystkich podprojektach. |
Włącz kompilację Renderscript tylko w podprojektach, w których znajdują się źródła Renderscript, ustawiając tę właściwość w plikach kompilacji Gradle tych projektów:
android {
buildFeatures {
renderScript = true
}
} |
Wymuszone właściwości Gradle
Jeśli ustawisz te właściwości Gradle, AGP 9.0 zwróci błąd.
Asystent uaktualniania wtyczki Androida do obsługi Gradle nie uaktualni do AGP 9.0 projektów, które używają tych właściwości.
| Właściwość | Funkcja |
|---|---|
android. |
Zmniejszanie zasobów jest teraz zawsze uruchamiane w ramach R8, a poprzednia implementacja została usunięta. |
android. |
Zmniejszanie zasobów zawsze korzysta teraz z precyzyjnego zmniejszania zasobów, co pozwala na usunięcie większej liczby elementów. |
Zmiany w R8
Wtyczka Androida do obsługi Gradle 9.0.0 zawiera te zmiany w R8.
Nowa opcja konfiguracji: -processkotlinnullchecks
Dodaliśmy nową opcję R8 -processkotlinnullchecks, która umożliwia skonfigurowanie R8 do przetwarzania kontroli wartości null w Kotlinie. Opcja wymaga argumentu, który musi być jedną z tych 3 wartości: keep, remove_message lub remove.
Ta opcja przetwarza te testy wartości null dodane przez kompilator Kotlina:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
Wartości opcji, uporządkowane od najsłabszej do najsilniejszej, mają następujący efekt:
keepnie zmienia kontroli.remove_messageprzekształca każde wywołanie metody sprawdzającej w wywołaniegetClass()na pierwszym argumencie wywołania (skutecznie zachowując sprawdzanie wartości null, ale bez żadnego komunikatu).removecałkowicie usuwa kontrole.
Domyślnie R8 używa remove_message. Każda specyfikacja -processkotlinnullchecks zastąpi to ustawienie. Jeśli zostanie określona kilka razy, używana jest najsilniejsza wartość.
Zatrzymaj propagowanie informacji o zachowaniu do metod towarzyszących
Gdy reguły zachowania pasują do metod interfejsu, które podlegają odlukrzaniu, R8 wcześniej wewnętrznie przenosił bity nie zezwalaj na optymalizację i nie zezwalaj na zmniejszanie do syntetyzowanych metod towarzyszących.
Począwszy od AGP 9.0, reguły zachowywania nie mają już zastosowania do metod towarzyszących. Jest to zgodne z faktem, że reguły zachowywania nie mają zastosowania do innych pól, metod ani klas syntetyzowanych przez kompilator.
Dzięki przeniesieniu bitów disallow optimization i disallow shrinking do metod towarzyszących wcześniej obsługiwany był ten przypadek użycia:
- Skompiluj bibliotekę z metodami interfejsu
default/static/privatedo DEX zminSdk< 24 i regułami, które zachowują metody interfejsu. - Skompiluj aplikację z biblioteką w ścieżce klasy i
-applymapping. - Scal aplikację i bibliotekę.
Pamiętaj, że działa to tylko z -applymapping, ponieważ bit disallow
obfuscation nie jest przenoszony do metod towarzyszących – oznacza to, że klasy towarzyszące wygenerowane w kroku 1 będą miały zaciemnione nazwy metod.
W przyszłości ten przypadek użycia nie będzie już obsługiwany w przypadku wersji minSdk < 24. Aby obejść ten problem:
- Zastosuj desugaryzację do biblioteki z metodami interfejsu
default/static/privatedo plików klas zminSdk< 24. - Skompiluj odlukrzony artefakt za pomocą R8 i reguł, które zachowują metody interfejsu w klasach towarzyszących.
- Skompiluj aplikację z biblioteką w ścieżce klasy.
- Scal aplikację i odlukrzony artefakt.
Innym efektem ubocznym jest to, że nie można już zachować atrybutów klasy wewnętrznej i metody otaczającej dla klas anonimowych i lokalnych w metodach towarzyszących interfejsu.
Zmień domyślny wygenerowany plik źródłowy na r8-map-id-<MAP_ID>
Ta zmiana jest wprowadzana we wtyczce AGP od wersji 8.12.0.
Domyślny atrybut wygenerowanego pliku źródłowego klasy zmienia się z SourceFile na r8-map-id-<MAP_ID>, gdy wymagane jest odtworzenie (czyli gdy włączone jest zaciemnianie lub optymalizacja).
W przypadku zaciemnionego zrzutu stosu nowy atrybut pliku źródłowego umożliwia wyodrębnienie identyfikatora pliku mapowania, który jest wymagany do odtworzenia. Można go użyć do obsługi automatycznego odtwarzania zrzutów stosu w Logcat.
Jeśli używany jest atrybut niestandardowego pliku źródłowego (-renamesourcefileattribute),
nadal ma on pierwszeństwo.
W trybie zgodności z ProGuard (gdy gradle.properties zawiera android.enableR8.fullMode=false) emitowanie atrybutu pliku źródłowego r8-map-id-<MAP_ID> działa tylko wtedy, gdy atrybut SourceFile nie jest zachowywany. Aplikacje, które używają trybu zgodności ProGuard i chcą uwzględniać identyfikator pliku mapowania w zrzutach stosu, powinny usunąć -keepattributes SourceFile (lub przejść na tryb pełny R8).
Identyfikator mapy używany w r8-map-id-<MAP_ID> to pełny skrót mapy, a nie 7-znakowy prefiks skrótu mapy, który był używany wcześniej.
Włącz używanie zminimalizowanych nazw syntetycznych w odlukrzaniu L8
Nazwa klas syntetycznych generowanych przez D8 zwykle zawiera podłańcuch $$ExternalSynthetic, który informuje, że jest to klasa syntetyczna wygenerowana przez D8.
Co więcej, nazwa elementu syntetycznego koduje również jego rodzaj (np. Backport, Lambda). Ma to negatywny wpływ na wynikowy rozmiar DEX, ponieważ nazwy klas zajmują więcej miejsca w puli ciągów znaków.
AGP 9.0 konfiguruje L8 (odlukrzanie biblioteki podstawowej), dzięki czemu plik DEX zawierający wszystkie klasy j$ używa nowego, skróconego formatu nazw klas syntetycznych. Nowa nazwa klasy używa identyfikatora numerycznego (np. $1).
Usuń pomoc dotyczącą -addconfigurationdebugging
AGP 9.0 nie obsługuje już -addconfigurationdebugging. Jeśli flaga jest używana, kompilator wyświetla teraz ostrzeżenie.
Usunięcie obsługi generowania reguł L8 z D8/R8
Ta zmiana dotyczy tylko deweloperów, którzy używają bezpośrednio wiersza poleceń lub interfejsów API D8/R8.
R8 9.0 nie obsługuje już generowania reguł zachowywania dla L8 z D8 i R8.
Zamiast tego użyj TraceReferences.
Dokładniej mówiąc, metody D8Command.builder.setDesugaredLibraryKeepRuleConsumer i R8Command.Builder.setDesugaredLibraryKeepRuleConsumer zostały usunięte, a obsługa --desugared-lib-pg-conf-output została usunięta z opcji wiersza poleceń D8 i R8.
Rozwiązane problemy
Wtyczka Androida do obsługi Gradle w wersji 9.0.0
| Rozwiązane problemy | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Linter |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Integracja z linterem |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Kompresor (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||