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.0, użyj Asystenta uaktualniania wtyczki Androida do obsługi Gradle.
Asystent uaktualniania AGP pomaga zachować dotychczasowe działanie podczas uaktualniania projektu, gdy jest to odpowiednie. Dzięki temu możesz uaktualnić projekt, aby używać AGP 9.0, nawet jeśli nie chcesz jeszcze stosować wszystkich nowych ustawień domyślnych w AGP 9.0.
Zgodność
Maksymalny poziom interfejsu API obsługiwany przez wtyczkę Androida do Gradle w wersji 9.0 to poziom 36. Inne informacje o zgodności:
| Wersja minimalna | Wersja domyślna | Uwagi | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | Więcej informacji znajdziesz w artykule Aktualizowanie Gradle. |
| Narzędzia do kompilacji pakietu SDK | 36.0.0 | 36.0.0 | Zainstaluj lub skonfiguruj narzędzia SDK Build Tools. |
| NDK | Nie dotyczy | 28.2.13676358 | Zainstaluj lub skonfiguruj inną wersję NDK. |
| JDK | 17 | 17 | Więcej informacji znajdziesz w artykule Ustawianie wersji JDK. |
Klasy android DSL 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. Wtyczki AGP w wersjach 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 trakcie prac nad interfejsami.
AGP 9.0 korzysta wyłącznie z naszych nowych interfejsów DSL, a implementacje zostały zmienione na nowe typy, które są w pełni ukryte. Spowoduje to również usunięcie dostępu do starego, wycofanego interfejsu API wariantu.
Aby zaktualizować wtyczkę Androida do obsługi Gradle do wersji 9.0, może być konieczne wykonanie tych czynności:
- Upewnij się, że projekt jest zgodny z wbudowanym Kotlinem: wtyczka
org.jetbrains.kotlin.androidnie jest zgodna z nowym DSL. Przełącz projekty KMP na wtyczkę Android Gradle Library Plugin for 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: zmiana interfejsów ma na celu zachowanie jak największego podobieństwa DSL, ale mogą wystąpić niewielkie zmiany.
Zaktualizuj niestandardową logikę kompilacji, aby odwoływała się do nowego języka DSL i interfejsu API: zastąp wszystkie odwołania do wewnętrznego języka DSL interfejsami publicznego języka DSL. W większości przypadków będzie to wymiana 1:1. Zastąp wszystkie użycia interfejsów API
applicationVariantsi podobnych nowymandroidComponentsAPI. Może to być bardziej skomplikowane, ponieważandroidComponentsinterfejs API jest zaprojektowany tak, aby był bardziej stabilny i zapewniał dłuższą zgodność wtyczek. Przykłady znajdziesz w przepisach Gradle.Zaktualizuj wtyczki innych firm: niektóre wtyczki innych firm mogą nadal korzystać z interfejsów lub interfejsów API, które nie są już udostępniane. 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, w tym:
Wycofany interfejs API w bloku android |
Funkcja | Wymiana |
|---|---|---|
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 oraztestServer
|
Rejestracja niestandardowych środowisk testowych do przeprowadzania testów na urządzeniach i emulatorach z Androidem. | 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 wykonywania 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
|
Przestarzałe ustawienia związane z narzędziem dx, które zostało zastąpione przez d8. Żadne z tych ustawień nie ma wpływu na działanie wtyczki Androida do obsługi Gradle w wersji 7.0.
|
Nie ma bezpośredniego zamiennika. |
generatePureSplits
|
Generowanie podziałów 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 AAR, aby udostępnić je jako interfejs API bibliotekom i aplikacjom, które są od tej biblioteki zależne. |
Jest ona nadal widoczna w przypadku LibraryExtension, ale nie w przypadku innych typów rozszerzeń.
|
Jeśli po uaktualnieniu do AGP 9.0 zobaczysz 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ę niekompatybilne wtyczki innych firm, możesz zrezygnować z nich i przywrócić stare implementacje DSL oraz stary interfejs API wariantów.
W tym czasie nowe interfejsy są też dostępne i nadal możesz zaktualizować własną logikę kompilacji do nowego interfejsu API. Aby zrezygnować, umieść w pliku gradle.properties ten wiersz:
android.newDsl=false
Możesz też rozpocząć uaktualnianie do nowych interfejsów API przed uaktualnieniem do AGP 9.0. Nowe interfejsy są dostępne w wielu wersjach AGP, więc możesz mieć połączenie nowych i starych. W dokumentacji referencyjnej interfejsu AGP API znajdziesz informacje o interfejsie API dla każdej wersji AGP oraz daty dodania poszczególnych klas, metod i pól.
W fazie alfa wersji 9.0 kontaktujemy się z autorami wtyczek, aby pomóc im dostosować i opublikować wtyczki w pełni zgodne z nowymi trybami. Ulepszymy też Asystenta uaktualniania AGP w Androidzie Studio, aby przeprowadzić Cię przez proces migracji.
Jeśli zauważysz, że w nowym interfejsie DSL lub Variant API brakuje funkcji lub możliwości, 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ż przeprowadzić migrację na wbudowany język Kotlin lub zrezygnować.
Możesz też wybiórczo wyłączyć wbudowaną obsługę języka Kotlin w podprojektach Gradle, które nie zawierają ź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 Gradle do obsługi języka Kotlin (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 zaktualizuje ją do wersji 2.2.10-2.0.2, aby była zgodna z wersją KGP.
Uaktualnianie do wyższej wersji KGP
Aby użyć wyższej wersji KGP lub KSP, dodaj ten kod do pliku najwyższego poziomu:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
Przechodzenie 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, a wbudowany język Kotlin wymaga KGP w wersji 2.2.10 lub nowszej.
Aby użyć starszej wersji KGP lub KSP, zadeklaruj tę wersję w pliku kompilacji najwyższego poziomu za pomocą deklaracji ścisłej wersji:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtoolsksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
Pamiętaj, że minimalna wersja KGP, do której możesz się cofnąć, to 2.0.0.
Obsługa środowiska IDE w przypadku plików testowych
AGP 9.0 zapewnia pełną obsługę środowiska IDE Android Studio w przypadku testów.
Wtyczka Fused Library
Wtyczka Fused Library Plugin (wersja przedpremierowa) umożliwia publikowanie wielu bibliotek jako jednego pliku AAR biblioteki Androida. Ułatwi to użytkownikom korzystanie z opublikowanych artefaktów.
Więcej informacji o tym, jak zacząć, znajdziesz w artykule Publikowanie wielu bibliotek Androida jako jednej za pomocą biblioteki Fused.
Zmiany w działaniu
Wtyczka Androida do obsługi Gradle w wersji 9.0 ma te nowe funkcje:
| Działanie | 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 w wersji 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 nowszego pakietu SDK do kompilacji.
Jeśli nie jest to możliwe lub chcesz dać użytkownikom biblioteki, którą publikujesz, więcej czasu na przejście na nową wersję, ustaw wyraźnie AarMetadata.minCompileSdk.
|
Wtyczka AGP 9.0 zawiera aktualizacje domyślnych wartości tych właściwości Gradle. Dzięki temu podczas uaktualniania możesz zachować działanie wtyczki Androida do obsługi Gradle w wersji 8.13:
| Właściwość | Funkcja | Zmiana z AGP 8.13 na AGP 9.0 | Rekomendacja |
|---|---|---|---|
android. |
Używaj nowych interfejsów DSL bez ujawniania starszych implementacji bloku android.Oznacza to również, że starszy interfejs API wariantów, np. android.applicationVariants
nie jest już dostępny.
|
false → true |
Możesz zrezygnować z tej opcji, ustawiając parametr
android.newDsl=false.Gdy wszystkie wtyczki i logika kompilacji używane w projekcie będą zgodne, usuń rezygnację. |
android. |
Włącza wbudowany język Kotlin. | false → true |
Przejdź na wbudowany język Kotlin, jeśli możesz, lub zrezygnuj z tej funkcji. |
android. |
Wymaga, aby każda biblioteka miała inną nazwę pakietu. | false → true |
Podaj unikalne nazwy pakietów dla wszystkich bibliotek w projekcie. Jeśli to niemożliwe, możesz wyłączyć tę flagę na czas migracji. |
android. |
Używaj domyślnie zależności androidx.
|
false → true |
Przyjmij zależności androidx.
|
android. |
Domyślnie uruchamiaj testy na urządzeniu za pomocą klasy androidx.test.runner.AndroidJUnitRunner, zastępując domyślną klasę InstrumentationTestRunner, która jest już przestarzała.
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
Adopt
AndroidJUnitRunner,
lub wyraźnie określ własny parametr testInstrumentationRunner.
|
android. |
Określa, czy między konfiguracjami mają być stosowane ograniczenia zależności. Domyślne ustawienie w AGP 9.0 to false, które używa ograniczeń tylko w testach urządzeń aplikacji (AndroidTest).
Ustawienie tej wartości na true przywróci działanie z wersji 8.13.
|
true → false |
Nie używaj ograniczeń zależności wszędzie, chyba że jest to konieczne. Zaakceptowanie nowego domyślnego ustawienia tego flagi umożliwia też optymalizacje w procesie importowania projektu, co powinno skrócić czas importowania kompilacji z wieloma podprojektami biblioteki Androida. |
android. |
Kompiluj kod w aplikacjach z użyciem nieostatecznej klasy R, aby dostosować kompilację aplikacji do kompilacji biblioteki. Zwiększa to przyrostowość i przygotowuje grunt pod przyszłe optymalizacje wydajności w przepływie przetwarzania zasobów. |
false → true |
Wiele projektów może po prostu przyjąć nowe zachowanie bez wprowadzania zmian w kodzie źródłowym. Jeśli pola klasy R są używane w miejscach, w których wymagana jest stała, np. w przypadkach instrukcji switch, zmień kod, aby używać połączonych instrukcji if. |
android. |
Używa wersji pakietu SDK do kompilacji jako wartości domyślnej wersji pakietu SDK docelowego w aplikacjach i testach. Przed tą zmianą docelowa wersja pakietu SDK była domyślnie ustawiana na minimalną wersję pakietu SDK. |
false → true |
Określ bezpośrednio docelową wersję pakietu SDK w przypadku aplikacji i testów. |
android. |
Tworzy tylko komponenty testów jednostkowych dla testowanego typu kompilacji. W projekcie domyślnym powoduje to utworzenie jednego testu jednostkowego do debugowania, podczas gdy wcześniej testy jednostkowe były uruchamiane do debugowania lub wydania. |
false → true |
Jeśli Twój projekt nie wymaga uruchamiania testów zarówno w wersji debugowania, jak i w wersji produkcyjnej, nie musisz nic zmieniać. |
android. |
W przypadku braku na dysku któregokolwiek z plików do zachowania określonych w DSL AGP kompilacja zakończy się niepowodzeniem i wyświetli błąd. Przed tą zmianą literówki w nazwach plików powodowały, że pliki były cicho ignorowane. | false → true |
Usuń nieprawidłowe deklaracje plików ProGuard |
android. |
Umożliwia R8 zachowanie mniejszej liczby zasobów Androida, ponieważ uwzględnia klasy i zasoby Androida razem. | false → true |
Jeśli reguły przechowywania w projekcie są już kompletne, nie musisz nic zmieniać. |
android. |
Umożliwia R8 zachowanie mniejszej liczby elementów, ponieważ nie zachowuje domyślnego konstruktora, gdy klasa jest zachowywana.
Oznacza to, że -keep class A nie implikuje 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
wartością
-keep class A { <init>(); }
w regułach przechowywania projektu we wszystkich przypadkach, w których chcesz zachować domyślny konstruktor.
|
android. |
Włącza
resValues
we wszystkich podprojektach
|
true → false |
Włącz resValues tylko w podprojektach, które tego wymagają, ustawiając w plikach kompilacji Gradle tych projektów te wartości:
android {
buildFeatures {
resValues = true
}
} |
android. |
Umożliwia kompilację shaderów we wszystkich podprojektach. | true → false |
Włącz kompilację shaderów tylko w podprojektach, które zawierają shadery 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 zapobiegać przypadkowemu użyciu flagi dontoptimize, która jest częścią proguard-android.txt.
|
false → true |
Jeśli chcesz uniknąć optymalizacji, możesz w pliku proguardFile wyraźnie określić dontoptimize, 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 chcesz tego robić, zrezygnuj z tej opcji, ustawiając android.r8.globalOptionsInConsumerRules.disallowed=false.
|
android. |
Od wtyczki AGP 9.0 publikowanie biblioteki Androida i modułu funkcji zakończy się niepowodzeniem, jeśli pliki keep konsumenta zawierają problematyczne konfiguracje Proguard. Pliki keep dla konsumentów, które zawierają opcje globalne, takie jak dontoptimize lub dontobfuscate, powinny być używane tylko w modułach aplikacji i mogą ograniczać korzyści z optymalizacji dla użytkowników biblioteki. Kompilacja modułu aplikacji na Androida będzie cicho ignorować takie opcje globalne, jeśli są one osadzone w wcześniej skompilowanej zależności (JAR lub AAR). Możesz sprawdzić, kiedy to nastąpi, przeglądają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 |
W opublikowanych bibliotekach należy usunąć wszystkie niezgodne reguły. Biblioteki wewnętrzne powinny przenosić wszelkie niezgodne, ale wymagane reguły do pliku proguardFile w module aplikacji. Zrezygnuj, ustawiając android.r8.globalOptionsInConsumerRules.disallowed=false. Gdy wszystkie pliki konsumenckie będą zgodne, wycofaj rezygnację.
|
android. |
Zabroń przekazywania dostawców wygenerowanym źródłom za pomocą DSL AndroidSourceSet.
|
false → true |
Użyj interfejsu API Sources na androidComponents, aby zarejestrować wygenerowane źródła.
|
android. |
Wymaga jawnego ustawienia ścieżki kompilatora cieniowania w local.properties, jeśli kompilacja cieniowania jest włączona.
|
false → true |
Dodaj glslc.dir=/path/to/shader-tools do 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 konfiguracjiwearAppiAndroidSourceSet.wearAppConfigurationNameDSL. Więcej informacji o publikowaniu aplikacji na Wear OS znajdziesz w artykule Dystrybucja na Wear OS. androidDependenciesisourceSetszgłaszanie zadania- Obsługa pakietów APK podzielonych według gęstości ekranu
AGP 9.0 usuwa obsługę tworzenia pakietów APK podzielonych według gęstości ekranu. Funkcja i powiązane z nią 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 języku DSL:
Parametryzacja funkcji
CommonExtensionzostała usunięta.Sama w sobie jest to tylko zmiana powodująca niezgodność na poziomie źródła, która ma pomóc w unikaniu takich zmian w przyszłości. Oznacza to jednak również, że metody blokowania muszą zostać przeniesione z
CommonExtensiondoApplicationExtension,LibraryExtension,DynamicFeatureExtensioniTestExtension.Podczas uaktualniania projektu do AGP 9.0 zmień kod wtyczki Gradle, który korzysta z tych parametrów lub metod blokowych. Na przykład ten wtyczka została zaktualizowana, aby usunąć parametr typu i nie korzystać z usuniętych metod 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 zakresu wersji AGP, bezpośrednie użycie metody pobierającej jest binarne zgodne 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ł.AndroidSourceSet.wearAppConfigurationName, ponieważ dotyczy to usuniętej obsługi wbudowanej aplikacji na Wear OS.BuildType.isRenderscriptDebuggable, ponieważ nie działał.DependencyVariantSelection. Zastępuje jąDependencySelection, która jest udostępniana jakokotlin.android.localDependencySelection.Installation.installOptions(String). Zostało ono zastąpione przez właściwość modyfikowalnąInstallation.installOptions.Blok eksperymentalny, który nigdy nie został ustabilizowany
PostProcessing.ProductFlavor.setDimension, która jest zastępowana przez właściwośćdimensionLanguageSplitOptions, która była przydatna 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 używaj pakietów aplikacji.
Usunięte interfejsy API
Wtyczka Androida do obsługi Gradle w wersji 9.0 usuwa:
AndroidComponentsExtension.finalizeDSl. Zastąpione przez:finalizeDslComponent.transformClassesWith. Zastąpione przez:Instrumentation.transformClassesWithComponent.setAsmFramesComputationMode. Zastąpione przez:Instrumentation.setAsmFramesComputationModeComponentBuilder.enabled. Zastępuje jąComponentBuilder.enable.DependenciesInfoBuilder.includedInApk. Zastąpienie:includeInApkDependenciesInfoBuilder.includedInBundle. Zastąpienie:includeInBundleGeneratesApk.targetSdkVersion. Zastąpiono ją wartościątargetSdkVariant.minSdkVersion. Zastąpiono ją wartościąminSdkVariant.maxSdkVersion. Zastąpiono ją wartościąmaxSdkVariant.targetSdkVersion. Zastąpiono ją wartościątargetSdkVariant.unitTest, ponieważ nie dotyczyło to wtyczkicom.android.test.unitTestjest dostępna w przypadku podtypówVariantBuilderrozszerzającychHasUnitTest.VariantBuilder.targetSdkitargetSdkPreview, ponieważ nie miały one znaczenia w bibliotekach. Zamiast niej używaj zasadyGeneratesApkBuilder.targetSdklubGeneratesApkBuilder.targetSdkPreview.VariantBuilder.enableUnitTest, ponieważ nie dotyczyło to wtyczkicom.android.test.enableUnitTestjest dostępna w przypadku podtypówVariantBuilderrozszerzającychHasUnitTestBuilder.Typ
VariantBuilder.unitTestEnabledzostał usunięty na rzecz bardziej spójnie nazwanego typuenableUnitTestw przypadku podtypówVariantBuilderrozszerzających typHasUnitTestBuilder.VariantOutput.enable. Zastąpiono ją wartościąenabledWycofane i wyłączone funkcje
FeaturePluginiFeatureExtension.Wycofane i wyłączone interfejsy API
BaseExtension.registerTransform, które były dostępne tylko po to, aby umożliwić kompilowanie pod kątem najnowszej wersji AGP przy jednoczesnym kierowaniu na AGP 4.2 lub starszą.
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. Włącz te funkcje tylko w podprojektach, które z nich korzystają, aby zwiększyć wydajność kompilacji.
| Właściwość | Funkcja | Wymiana |
|---|---|---|
android. |
Umożliwia kompilację AIDL we wszystkich podprojektach. |
Włącz kompilację AIDL tylko w podprojektach, w których znajdują się źródła AIDL, ustawiając w plikach kompilacji Gradle tych projektów tę właściwość:
android {
buildFeatures {
aidl = true
}
} |
android. |
Włącza kompilację RenderScript we wszystkich podprojektach. |
Włącz kompilację RenderScriptu tylko w podprojektach, w których znajdują się źródła RenderScriptu, ustawiając w plikach kompilacji Gradle tych projektów tę właściwość:
android {
buildFeatures {
renderScript = true
}
} |
Wymuszane właściwości Gradle
AGP 9.0 zgłasza błąd, jeśli ustawisz te właściwości Gradle.
Asystent uaktualniania wtyczki Androida do obsługi Gradle nie uaktualni projektów do wtyczki AGP 9.0, które korzystają z tych właściwości.
| Właściwość | Funkcja |
|---|---|
android. |
Zmniejszanie rozmiaru zasobów jest teraz zawsze przeprowadzane w ramach R8, a poprzednia implementacja została usunięta. |
android. |
Zmniejszanie zasobów zawsze korzysta teraz z precyzyjnego zmniejszania zasobów, co umożliwia usunięcie większej liczby zasobów. |
Zmiany w R8
W AGP 9.0.0 uwzględniono te zmiany w R8:
Nowa opcja konfiguracji -processkotlinnullchecks
Dodaliśmy nową opcję R8 -processkotlinnullchecks, która umożliwia skonfigurowanie R8 do przetwarzania sprawdzania wartości null w języku Kotlin. Opcja przyjmuje argument obowiązkowy, który musi mieć jedną z tych 3 wartości: keep, remove_message lub remove.
Ta opcja przetwarza te sprawdzenia wartości null dodane przez kompilator Kotlin:
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 wpływ:
keepnie zmienia kontroli.remove_messagezmienia każde wywołanie metody sprawdzania na wywołaniegetClass()na pierwszym argumencie wywołania (skutecznie zachowując sprawdzanie wartości null, ale bez żadnej wiadomości).removecałkowicie usuwa weryfikacje.
Domyślnie R8 używa remove_message. Wszelkie specyfikacje -processkotlinnullchecks
zastąpią to ustawienie. Jeśli zostanie podana kilka razy, użyta zostanie najsilniejsza wartość.
Przestań przekazywać informacje o zachowaniu do metod towarzyszących
Gdy reguły zachowywania pasują do metod interfejsu podlegających desugaryzacji, R8 wcześniej wewnętrznie przenosił bity disallow optimization i disallow shrinking do syntetyzowanych metod towarzyszących.
Od wtyczki 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.
Przenosząc bity disallow optimization i disallow shrinking do metod towarzyszących, wcześniej obsługiwaliśmy ten przypadek użycia:
- Skompiluj bibliotekę z metodami interfejsu
default/static/privatedo DEX z wartościąminSdk< 24 i regułami, które zachowują metody interfejsu. - Skompiluj aplikację z biblioteką w ścieżce klasy i
-applymapping. - Połącz aplikację z biblioteką.
Pamiętaj, że działa to tylko w przypadku -applymapping, ponieważ bit disallow
obfuscation nie jest przenoszony do metod towarzyszących, czyli klasy towarzyszące wygenerowane w kroku 1 będą miały zaciemnione nazwy metod.
Od tej pory ten przypadek użycia nie jest już obsługiwany w przypadku minSdk <
24. Aby obejść ten problem, wykonaj te czynności:
- Odśladzanie biblioteki za pomocą metod interfejsu
default/static/privatedo plików klas zminSdk< 24. - Skompiluj odcukrzony artefakt za pomocą R8 i reguł, które zachowują metody interfejsu w klasach towarzyszących.
- Skompiluj aplikację z biblioteką w ścieżce klasy.
- Połącz aplikację i odcukrzony 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 emitowany plik źródłowy na r8-map-id-<MAP_ID>
Ta zmiana jest dostępna w AGP od wersji 8.12.0.
Domyślny atrybut emitowanego pliku źródłowego dla klasy zmienia się z SourceFile na r8-map-id-<MAP_ID>, gdy wymagane jest ponowne śledzenie (czyli gdy włączone jest zaciemnianie lub optymalizacja).
Nowy atrybut pliku źródłowego umożliwia wyodrębnianie identyfikatora pliku mapowania wymaganego do śledzenia wstecznego na podstawie zaciemnionego śladu stosu. Można go używać do obsługi automatycznego śledzenia wstecznego śladów stosu w Logcat.
Jeśli używany jest atrybut niestandardowego pliku źródłowego (-renamesourcefileattribute), ten atrybut niestandardowego pliku źródłowego nadal ma pierwszeństwo.
W trybie zgodności z ProGuardem (gdy gradle.properties zawiera android.enableR8.fullMode=false) emitowanie atrybutu pliku źródłowego r8-map-id-<MAP_ID> ma zastosowanie 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 śladach 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 hash mapy, a nie 7-znakowy prefiks tego hasha, który był używany wcześniej.
Włącz używanie zminimalizowanych nazw syntetycznych w procesie desugaringu L8
Nazwa klas syntetycznych generowanych przez D8 zwykle zawiera podciąg $$ExternalSynthetic, który informuje, że jest to klasa syntetyczna wygenerowana przez D8.
Ponadto nazwa elementu syntetycznego zawiera też jego rodzaj (np. Backport, Lambda). Ma to negatywny wpływ na rozmiar wynikowego pliku DEX, ponieważ nazwy klas zajmują więcej miejsca w puli ciągów.
AGP 9.0 konfiguruje L8 (odcukrzanie biblioteki podstawowej) w taki sposób, aby plik DEX zawierający wszystkie klasy j$ używał nowego, skróconego formatu nazw klas syntetycznych. Nowa nazwa zajęć używa identyfikatora numerycznego (np. $1).
Usunięcie obsługi -addconfigurationdebugging
Wtyczka Androida do obsługi Gradle 9.0 nie obsługuje już -addconfigurationdebugging. Kompilator zgłasza teraz ostrzeżenie, jeśli używana jest ta flaga.
Wycofanie obsługi generowania reguł L8 z D8/R8
Ta zmiana dotyczy tylko deweloperów, którzy bezpośrednio korzystają z wiersza poleceń D8/R8 lub interfejsów API.
W R8 9.0 usunięto obsługę generowania reguł keep dla L8 z D8 i R8.
Zamiast tego użyj w tym celu funkcji TraceReferences.
W szczególności usuwamy metody D8Command.builder.setDesugaredLibraryKeepRuleConsumer i R8Command.Builder.setDesugaredLibraryKeepRuleConsumer, a także obsługę --desugared-lib-pg-conf-output z opcji wiersza poleceń D8 i R8.
Rozwiązane problemy
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-rc03
| Rozwiązane problemy | ||
|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-rc02
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0-rc02 nie oznaczono żadnych publicznych problemów jako naprawionych |
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-rc01
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0-rc01 nie oznaczono żadnych publicznych problemów jako naprawionych |
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-beta05
| Rozwiązane problemy | ||
|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-beta04
| Rozwiązane problemy | |||
|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-beta03
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0-beta03 nie oznaczono żadnych publicznych problemów jako naprawionych |
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-beta02
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
| Linter |
|
|||
| Integracja z linterem |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-beta01
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0-beta01 nie oznaczono żadnych publicznych problemów jako rozwiązanych |
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha14
| Rozwiązane problemy | |||||||
|---|---|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||||
| Integracja z linterem |
|
||||||
| Shrinker (R8) |
|
||||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha13
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha12
| Rozwiązane problemy | |||||
|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha11
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha10
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
| Linter |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha09
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha08
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0-alpha08 nie oznaczono żadnych publicznych problemów jako naprawionych |
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha07
| Rozwiązane problemy | |||||||||
|---|---|---|---|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha06
| Rozwiązane problemy | |||||
|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||
| Linter |
|
||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha05
| Rozwiązane problemy | |||||
|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||
| Linter |
|
||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha04
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
| Linter |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha03
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
| Linter |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha02
| Rozwiązane problemy | ||||
|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
|||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0-alpha01
| Rozwiązane problemy | |||||||
|---|---|---|---|---|---|---|---|
| Wtyczka Androida do obsługi Gradle |
|
||||||
Wtyczka Androida do obsługi Gradle w wersji 9.0.0
| Rozwiązane problemy | |
|---|---|
| W AGP 9.0.0 nie oznaczono żadnych publicznych problemów jako naprawionych |