Wtyczka Androida do obsługi Gradle w wersji 9.0.1 (styczeń 2026 r.)

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.android nie jest zgodna z nowym DSL.
  • Przełącz projekty KMP na wtyczkę biblioteki Android Gradle do KMP: używanie wtyczki org.jetbrains.kotlin.multiplatform w tym samym podprojekcie Gradle co wtyczki com.android.library i com.android.application jest 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 applicationVariants i podobnych interfejsów API nowym interfejsem API androidComponents. Może to być bardziej skomplikowane, ponieważ interfejs API androidComponents został 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 i
unitTestVariants
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)
    }
}
Nie wszystkie poprzednie interfejsy API mogą mieć bezpośrednie odpowiedniki. Jeśli masz przypadek użycia, którego nie obsługują nowe interfejsy API wariantów, zgłoś problem.
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 i
adbExe
używanie różnych komponentów pakietu Android SDK do niestandardowych zadań; Przełącz na androidComponents.sdkComponents.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider i
wrapJavaSourceSet
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.newDsl 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.builtInKotlin 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.uniquePackageNames 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.useAndroidx Domyślnie używaj zależności androidx. false → true Zastosuj zależności androidx.
android.default.androidx.test.runner 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.dependency.useConstraints 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.enableAppCompileTimeRClass 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.sdk.defaultTargetSdkToCompileSdkIfUnset 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.onlyEnableUnitTestForTheTestedBuildType 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.proguard.failOnMissingFiles 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.r8.optimizedResourceShrinking 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.r8.strictFullModeForKeepRules 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.defaults.buildfeatures.resvalues 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.defaults.buildfeatures.shaders 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.r8.proguardAndroidTxt.disallowed 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.r8.globalOptionsInConsumerRules.disallowed 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.sourceset.disallowProvider 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.custom.shader.path.required 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 konfiguracji wearApp i DSL AndroidSourceSet.wearAppConfigurationName. Informacje o tym, jak opublikować aplikację na Wear OS, znajdziesz w artykule Dystrybucja na Wear OS.
  • androidDependencies i sourceSets – 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 CommonExtension został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 CommonExtension do ApplicationExtension, LibraryExtension, DynamicFeatureExtension i TestExtension.

    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:

Usunięte interfejsy API

Wtyczka Androida do obsługi Gradle w wersji 9.0 usuwa:

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.defaults.buildfeatures.aidl 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
  }
}
w pliku kompilacji Gradle każdego podprojektu zawierającego źródła AIDL.
android.defaults.buildfeatures.renderscript 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.r8.integratedResourceShrinking Zmniejszanie zasobów jest teraz zawsze uruchamiane w ramach R8, a poprzednia implementacja została usunięta.
android.enableNewResourceShrinker.preciseShrinking 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:

  • keep nie zmienia kontroli.
  • remove_message przekształca każde wywołanie metody sprawdzającej w wywołanie getClass() na pierwszym argumencie wywołania (skutecznie zachowując sprawdzanie wartości null, ale bez żadnego komunikatu).
  • remove cał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:

  1. Skompiluj bibliotekę z metodami interfejsu default/static/private do DEX z minSdk < 24 i regułami, które zachowują metody interfejsu.
  2. Skompiluj aplikację z biblioteką w ścieżce klasy i -applymapping.
  3. 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:

  1. Zastosuj desugaryzację do biblioteki z metodami interfejsu default/static/private do plików klas z minSdk < 24.
  2. Skompiluj odlukrzony artefakt za pomocą R8 i reguł, które zachowują metody interfejsu w klasach towarzyszących.
  3. Skompiluj aplikację z biblioteką w ścieżce klasy.
  4. 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
Prośba o dodanie funkcji: wstrzykiwanie idealnej wersji AGP jako właściwości
Stabilizacja SingleArtifact.VERSION_CONTROL_INFO_FILE
Błędne wyświetlanie danych wyjściowych logcat podczas androidTest connectedCheck
Wbudowana obsługa języka Kotlin we wtyczce Androida do obsługi Gradle nie powinna być synchronizowana ze zbiorami źródeł Kotlin
missingDimensionStrategy preferuje wersję pasującą do jej nazwy, nawet z niepowiązanego wymiaru
Wbudowana obsługa języka Kotlin we wtyczce Androida do obsługi Gradle nie powinna być synchronizowana ze zbiorami źródeł Kotlin
AGP 9.0.0-rc01 nie rozpoznaje bibliotek Kotlin za pomocą funkcji kotlin()
Wbudowany Kotlin nie publikuje ograniczenia zależności kotlin-stdlib w pliku pom Mavena
Dodaj element testowania rozbieżności między compileSdk i targetSdk
pusta wartość resConfigs powoduje niejasny błąd aapt
Projekt w czystej Javie jest zależny od biblioteki standardowej Kotlina.
Usunięcie wycofanych właściwości KotlinMultiplatformAndroidCompilationBuilder we wtyczce Androida do obsługi Gradle 9.0
`com.android.tools.build:gradle:9.0.0-alpha05` powinien mieć zależność interfejsu API od KGP i gradle-api
Zmiana nazwy wtyczki Gradle com.android.experimental.built-in-kotlin
AGP9: „variant.sources.kotlin!!.addGeneratedSourceDirectory()” nie działa
Sprawdzanie metadanych Aar podczas kompilacji pakietu SDK używa starego DSL
Usunięcie wycofanej właściwości `com.android.build.api.dsl.ManagedDevices.devices`
Wbudowana obsługa języka Kotlin we wtyczce Androida do obsługi Gradle nie powinna być synchronizowana ze zbiorami źródeł Kotlin
Niepowodzenie publikowania biblioteki Androida, jeśli plik keep konsumenta zawiera -dontobfuscate
Brak opcji drukowania mapowania zoptymalizowanych zasobów
Wywołanie finalizeDsl po zakończeniu tej fazy będzie powodować błąd
AGP inicjuje konfigurację jetifiera, nawet gdy jest on wyłączony
Wbudowany język Kotlin nie dodaje kotlinStdlib jako zależności czasu kompilacji, gdy właściwość `kotlin.stdlib.default.dependency` ma wartość „true” w plikach modułów i plikach POM.
Nowy DSL optymalizacji nie tworzy domyślnie pliku configuration.txt
AGP 8.13.0 nie może zweryfikować wykresu nawigacyjnego w module
AGP używa wycofanego interfejsu Gradle API: notacja z wieloma ciągami znaków
Ostrzegaj użytkowników próbujących użyć starszej biblioteki multidex z minSdkVersion >=21
Kompilacja nie powiedzie się, jeśli występują zadania generowania kodu.
W przypadku `android.builtInKotlin=false`, `android.newDsl=false` i `android.enableLegacyVariantApi=false` użycie wtyczki `kotlin-android` zakończy się niepowodzeniem z komunikatem „API 'applicationVariants' is obsolete” (Interfejs API „applicationVariants” jest przestarzały)
Wbudowany Kotlin nie może rozpoznać nieoznaczonej wersją biblioteki kotlin-stdlib, gdy kotlin.stdlib.default.dependency=false
DexData otwiera plik bez zamykania, co uniemożliwia czyszczenie
AndroidSourceDirectorySet nie powinien już rozszerzać PatternFilterable w AGP 9.0
Błąd Test Fixture w modułach tylko do testowania
Nieprawidłowy błąd podczas używania odbiorników kontekstu w testach
Nieprawidłowe błędy IDE dotyczące kodu Kotlin w testFixtures
Wtyczka `legacy-kapt` pomija przetwarzanie adnotacji, w przeciwieństwie do `kotlin-kapt`
compileSdkSpec.minorApiLevel nie działa z SettingsExtension
[fused lib - public] Generated fused library does not include sources
Atrybuty extractNativeLibs i useEmbeddedDex nie powinny pochodzić z pliku manifestu
Ostrzeżenia z R8 we wtyczce Androida do obsługi Gradle w wersji 9.0.0-alpha09
Usunięcie wycofanego elementu AndroidSourceSet.jni w AGP 9.0
Usunięcie metody Installation.installOptions() we wtyczce Androida do obsługi Gradle 9.0
Usunięcie BuildType.isRenderscriptDebuggable w AGP 9.0.
Usuń android.defaults.buildfeatures.renderscript
`com.android.kotlin.multiplatform.library` ulega awarii w przypadku urządzeń zarządzanych przez Gradle
Usuń domyślne flagi gradle.properties `android.defaults.buildfeatures.aidl`
Niepowodzenie kompilacji, gdy plik proguard nie istnieje
remove buildconfig defaults gradle.properties flags
Zmień domyślną wartość targetSdk aplikacji, aby była oparta na compileSdk, a nie na minSdk
Gdy włączona jest opcja `isIncludeAndroidResources`, `process{Variant}UnitTestManifest` nie może scalić użycia tools:overrideLibrary w AGP 8.12.0
Wtyczka Androida do obsługi Gradle powoduje wyświetlanie w Gradle ostrzeżeń o wycofaniu zadań testowych JVM
DependencyReportTask jest niezgodny z pamięcią podręczną konfiguracji
Przełącz domyślną wersję źródłową/docelową Javy z Javy 8 na Javę 11 we wtyczce Androida do obsługi Gradle 9.0
Zmiana domyślnej wartości android.useAndroidX na „true”
Lepszy wyjątek podczas stosowania wtyczki kapt z wbudowanym językiem Kotlin.
android.proguard.failOnMissingFiles nie działa w przypadku consumerProguardFiles
Zaktualizuj zależność wtyczki Gradle do obsługi języka Kotlin do wersji 2.2.10
Tworzenie KotlinJvmAndroidCompilation za pomocą interfejsu API KGP
Tryb jawnego interfejsu API Kotlin zastosowany do źródeł testowych
Linter
AGP 8.11.0: zadanie lintAnalyzeRelease ulega awarii podczas stosowania plików .gradle.kts za pomocą apply(from = "...")
Kontrola Lint ChecksSdkIntAtLeast nie sprawdza, czy adnotowana wartość jest prawidłowa
Wbudowany Kotlin nie dodaje pliku .kotlin_module do META-INF
Ścieżka klasy Lint zawiera zduplikowane klasy w różnych wersjach
Obejście problemu z zastępowaniem zasobów prywatnych nie działa (tools:override = "true")
Błąd: usunięcie nieużywanych zasobów nie powoduje usunięcia ich tłumaczeń i nie pojawia się pytanie o to
Lint wyświetla ostrzeżenie „Nie udało się wyczyścić pamięci podręcznych K2”
Lint wyświetla ostrzeżenie „Nie udało się wyczyścić pamięci podręcznych K2”
Integracja z linterem
Brak trafień w pamięci podręcznej AndroidLintAnalysisTask u różnych dostawców pakietu JDK lub w różnych wersjach podrzędnych z powodu różnic w systemPropertyInputs.javaVersion
Lint automatycznie używa najnowszego zainstalowanego pakietu SDK niezależnie od compileSdk, nie rejestruje się jako dane wejściowe zadania i przerywa buforowanie
Kompresor (R8)
Zoptymalizowane zmniejszanie zasobów R8 kończy się niepowodzeniem bez powiadomienia, jeśli używane są ostateczne identyfikatory zasobów