Wtyczka Androida do obsługi Gradle 8.0.0 (kwiecień 2023 r.)

Wtyczka Androida do obsługi Gradle w wersji 8.0.0 to wersja główna, która zawiera wiele nowych funkcji i ulepszeń.

Zgodność

Wersja minimalna Wersja domyślna Uwagi
Gradle z Androidem 8.0 z Androidem 8.0 Więcej informacji znajdziesz w artykule Aktualizowanie Gradle.
Narzędzia do kompilacji pakietu SDK 30.0.3 30.0.3 Zainstaluj lub skonfiguruj narzędzia SDK Build Tools.
NDK Nie dotyczy 25.1.8937393 Zainstaluj lub skonfiguruj inną wersję NDK.
JDK 17 17 Więcej informacji znajdziesz w artykule Ustawianie wersji JDK.

Wersje poprawek

Poniżej znajdziesz listę wersji poprawek wtyczki Androida do obsługi Gradle w wersji 8.0.

Wtyczka Androida do obsługi Gradle w wersji 8.0.2 (maj 2023 r.)

Listę błędów naprawionych w AGP 8.0.2 znajdziesz w artykule Zamknięte problemy w Android Studio 2022.2.1.

Wtyczka Androida do obsługi Gradle w wersji 8.0.1 (maj 2023 r.)

Ta niewielka aktualizacja zawiera następujące poprawki błędów:

Rozwiązane problemy
Błąd: „No VersionRequirement with the given id in the table” (W tabeli nie ma elementu VersionRequirement o podanym identyfikatorze) po uaktualnieniu AGP z wersji 7.2.2 do 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Niepowodzenie weryfikacji klasy w Androidzie 11

Zmiana powodująca niezgodność: w skrypcie kompilacji na poziomie modułu wymagana jest przestrzeń nazw

Przestrzeń nazw musisz ustawić w pliku build.gradle.kts na poziomie modułu, a nie w pliku manifestu. Możesz zacząć używać właściwości namespace DSL od AGP 7.3. Więcej informacji znajdziesz w artykule Ustawianie przestrzeni nazw.

Podczas migracji do DSL przestrzeni nazw pamiętaj o tych kwestiach:

  • W niektórych przypadkach poprzednie wersje AGP nieprawidłowo wywnioskują przestrzeń nazw testu z głównej przestrzeni nazw lub identyfikatora aplikacji. Asystent uaktualniania AGP blokuje uaktualnienie, jeśli stwierdzi, że główna przestrzeń nazw projektu i przestrzeń nazw testu są takie same. Jeśli uaktualnienie jest zablokowane, musisz ręcznie zmienić testNamespace i odpowiednio zmodyfikować kod źródłowy.
  • Po zmianie przestrzeni nazw testu może się zdarzyć, że kod zostanie skompilowany, ale testy instrumentowane nie powiodą się w czasie działania. Może się to zdarzyć, jeśli kod źródłowy testu z instrumentacją odwołuje się do zasobu zdefiniowanego zarówno w androidTest, jak i w źródłach aplikacji.

Więcej informacji znajdziesz w komentarzu 19 do zgłoszenia 191813691.

Zmiany powodujące niezgodność: domyślne wartości opcji kompilacji

Od AGP 8.0 domyślne wartości tych flag zostały zmienione, aby poprawić wydajność kompilacji. Aby uzyskać pomoc w dostosowaniu kodu do tych zmian, użyj Asystenta uaktualniania AGP (Narzędzia > Asystent uaktualniania AGP). Asystent uaktualniania przeprowadzi Cię przez proces aktualizacji kodu, aby dostosować go do nowego działania, lub ustawienia flag, aby zachować poprzednie działanie.

Zgłoś Nowa wartość domyślna Poprzednia wartość domyślna Uwagi
android.defaults.buildfeatures.buildconfig false true AGP 8.0 domyślnie nie generuje BuildConfig. Musisz określić tę opcję za pomocą DSL w projektach, w których jest ona potrzebna.
android.defaults.buildfeatures.aidl false true AGP 8.0 domyślnie nie włącza obsługi AIDL. Musisz określić tę opcję za pomocą DSL w projektach, w których jest ona potrzebna. Planujemy usunąć ten flagę we wtyczce Androida do obsługi Gradle 9.0.
android.defaults.buildfeatures.renderscript false true AGP 8.0 domyślnie nie włącza obsługi RenderScript. Musisz określić tę opcję za pomocą DSL w projektach, w których jest ona potrzebna. Ten flag zostanie usunięty we wtyczce Androida do obsługi Gradle 9.0.
android.nonFinalResIds true false AGP 8.0 domyślnie generuje klasy R z polami nieoznaczonymi jako final.
android.nonTransitiveRClass true false Wtyczka Androida do obsługi Gradle 8.0 generuje klasy R tylko dla zasobów zdefiniowanych w bieżącym module.
android.enableR8.fullMode true false AGP 8.0 domyślnie włącza pełny tryb R8. Więcej informacji znajdziesz w sekcji Pełny tryb R8.

Zmiany powodujące niezgodność: wymuszone wartości opcji kompilacji

Od AGP 8.0 nie możesz już zmieniać wartości tych flag. Jeśli podasz je w pliku gradle.properties, wartość zostanie zignorowana, a AGP wyświetli ostrzeżenia.

Zgłoś Wymuszona wartość Uwagi
android.dependencyResolutionAtConfigurationTime.warn true Wtyczka Androida do obsługi Gradle 8.0 wyświetla ostrzeżenie, jeśli podczas fazy konfiguracji wykryje rozwiązywanie konfiguracji, ponieważ ma to negatywny wpływ na czas konfiguracji Gradle.
android.r8.failOnMissingClasses true Wtyczka Androida do obsługi Gradle 8.0 przerywa kompilacje, które używają R8, jeśli brakuje klas, aby zapewnić lepszą optymalizację DEX. Aby rozwiązać ten problem, musisz dodać brakujące biblioteki lub -dontwarnzachować reguły. Więcej informacji znajdziesz w artykule Missing class warnings in R8 shrinker (Ostrzeżenia o brakujących klasach w kompresorze R8).
android.testConfig.useRelativePath true Gdy włączona jest obsługa używania zasobów, komponentów i plików manifestu Androida w testach jednostkowych, AGP 8.0 generuje plik test_config.properties, który zawiera tylko ścieżki względne. Dzięki temu testy jednostkowe Androida mogą zawsze korzystać z pamięci podręcznej kompilacji Gradle.
android.useNewJarCreator true AGP używa biblioteki Zipflinger podczas tworzenia plików JAR, aby zwiększyć wydajność kompilacji.
android.bundletool.includeRepositoriesInDependencyReport true Gdy dodawanie informacji o zależnościach pakietu SDK w plikach AAB i APK jest włączone, AGP 8.0 dodaje do tych informacji również listę repozytoriów projektu. Więcej informacji znajdziesz w artykule Informacje o zależnościach w Konsoli Play.
android.enableArtProfiles true Profile podstawowe są teraz zawsze generowane. Więcej informacji znajdziesz w sekcji Profile podstawowe.
android.enableNewResourceShrinker true Domyślnie używaj nowej implementacji narzędzia do zmniejszania rozmiaru zasobów. Nowy kompresor zasobów obsługuje funkcje dynamiczne.
android.enableSourceSetPathsMap true Używane do obliczania względnych map ścieżek zasobów, dzięki czemu kompilacje Gradle są częściej aktualne.
android.cacheCompileLibResources true Skompilowane zasoby biblioteki można teraz domyślnie buforować, ponieważ Gradle śledzi pliki zasobów względem lokalizacji projektu. Wymaga włączenia android.enableSourceSetPathsMap.
android.disableAutomaticComponentCreation true AGP 8.0 domyślnie nie tworzy elementu SoftwareComponent. Zamiast tego AGP tworzy komponenty oprogramowania tylko dla wariantów, które są skonfigurowane do publikowania za pomocą DSL publikowania.

Nowa stabilna flaga profilu wykonania

AGP zawiera nową flagę android.settings.executionProfile. Użyj tego parametru, aby zastąpić domyślny profil wykonania z SettingsExtension. Więcej informacji znajdziesz w dokumentacji wtyczki ustawień.

Aby wyświetlić podgląd eksperymentalnych flag, zapoznaj się z informacjami o wersji.

Przypisywanie właściwości leniwych w języku Kotlin nie jest obsługiwane

Jeśli do skryptów kompilacji używasz Kotlin DSL w Gradle, pamiętaj, że Android Studio i wtyczka Androida do obsługi Gradle w wersji 8.0 nie obsługują eksperymentalnego przypisywania właściwości za pomocą operatora =. Więcej informacji o tej funkcji znajdziesz w informacjach o wersjidokumentacji.

Kategorie zadań Analizatora kompilacji

Od Androida Studio Flamingo Analizator kompilacji ma nowy widok domyślny dla zadań, które wpływają na czas trwania kompilacji. Jeśli Twój projekt korzysta z AGP 8.0 lub nowszego, zamiast wyświetlać zadania pojedynczo, Analizator kompilacji grupuje je według kategorii. Na przykład zadania związane z zasobami Androida, Kotlinem lub Dexingiem są grupowane, a następnie sortowane według czasu trwania kompilacji. Dzięki temu łatwo sprawdzisz, która kategoria ma największy wpływ na czas kompilacji. Po rozwinięciu każdej kategorii wyświetli się lista odpowiednich zadań. Aby wyświetlać zadania pojedynczo, bez grupowania, użyj menu Grupuj według.

Kategorie zadań Analizatora kompilacji.

Nowa wtyczka ustawień

W AGP 8.0.0-alpha09 wprowadziliśmy nową wtyczkę ustawień. Wtyczka ustawień umożliwia centralizację konfiguracji globalnych – konfiguracji, które mają zastosowanie do wszystkich modułów – w jednym miejscu, dzięki czemu nie musisz kopiować i wklejać konfiguracji w wielu modułach. Możesz też użyć wtyczki ustawień, aby utworzyć profile wykonywania narzędzi lub różne instrukcje dotyczące sposobu uruchamiania narzędzia i przełączać się między nimi.

Aby użyć wtyczki ustawień, zastosuj ją w pliku settings.gradle:

apply plugin 'com.android.settings'

Scentralizuj konfiguracje globalne

Aby skonfigurować konfiguracje globalne, użyj nowego bloku android w pliku settings.gradle. Oto przykład:

android {
  compileSdk 31
  minSdk 28
  ...
}

Profile wykonania narzędzia

Wtyczka ustawień umożliwia też tworzenie profili wykonywania dla niektórych narzędzi. Profil wykonania określa sposób działania narzędzia. W zależności od środowiska możesz wybrać różne profile wykonania. W profilu wykonania możesz ustawić argumenty JVM dla narzędzia i skonfigurować je tak, aby działało w osobnym procesie. Obecnie obsługiwane jest tylko narzędzie R8.

Utwórz profile wykonania i ustaw domyślny profil wykonania w pliku settings.gradle, jak pokazano w tym przykładzie:

android {
  execution {
    profiles {
      high {
        r8 {
          jvmOptions += ["-Xms2048m", "-Xmx8192m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      low {
        r8 {
          jvmOptions += ["-Xms256m", "-Xmx2048m", "-XX:+HeapDumpOnOutOfMemoryError"]
          runInSeparateProcess true
        }
      }
      ci {
        r8.runInSeparateProcess false
      }
    }
    defaultProfile "low"
  }
}

Aby zastąpić profil domyślny, wybierz inny profil za pomocą właściwości android.experimental.settings.executionProfile w pliku gradle.properties:

android.experimental.settings.executionProfile=high

Możesz też ustawić tę właściwość przy użyciu wiersza poleceń, co pozwala skonfigurować różne przepływy pracy. Jeśli na przykład masz przepływ pracy ciągłej integracji, możesz użyć wiersza poleceń, aby zmienić profil wykonania bez konieczności zmiany pliku settings.gradle:

./gradlew assembleRelease \
  -Pandroid.experimental.settings.executionProfile=ci

Do uruchomienia wtyczki Androida do obsługi Gradle 8.0 wymagany jest pakiet JDK 17

Jeśli do kompilacji aplikacji używasz wtyczki Androida do obsługi Gradle w wersji 8.0, do uruchomienia Gradle jest teraz wymagany pakiet JDK 17. Android Studio Flamingo zawiera JDK 17 i domyślnie konfiguruje Gradle do używania. Oznacza to, że większość użytkowników Androida Studio nie musi wprowadzać żadnych zmian w konfiguracji swoich projektów.

Jeśli trzeba ręcznie ustawić wersję JDK używaną przez wtyczkę Androida do obsługi Gradle w Android Studio, musisz zastosować JDK 17 lub nowszy.

Jeśli używasz wtyczki Androida do obsługi Gradle niezależnie od Androida Studio, zaktualizuj wersję JDK, ustawiając JAVA_HOME zmienną środowiskową lub -Dorg.gradle.java.home opcję wiersza poleceń na katalog instalacyjny JDK 17.

Rozwiązane problemy

Wtyczka Androida do obsługi Gradle w wersji 8.0.2

Rozwiązane problemy
Shrinker (R8)
R8 kończy się niepowodzeniem podczas kompilacji Compose z błędem ArrayIndexOutOfBoundsException
VerifyError: Verifier rejected class podczas używania R8 z Kotlinem w wersji 1.8.20
R8 w AGP 8 powoduje awarię usługi Google Fit
Informacje o pliku źródłowym z nazwami resztkowymi, które pokrywają się z nazwami wejściowymi, nie są prawidłowo reprezentowane.

Wtyczka Androida do obsługi Gradle w wersji 8.0.1

Rozwiązane problemy
Shrinker (R8)
Błąd: „No VersionRequirement with the given id in the table” (W tabeli nie ma elementu VersionRequirement o podanym identyfikatorze) po uaktualnieniu AGP z wersji 7.2.2 do 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Niepowodzenie weryfikacji klasy w Androidzie 11

Wtyczka Androida do obsługi Gradle w wersji 8.0.0

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
Niepewne niepowodzenie kompilacji w zadaniu MergeResources
JavaPluginConvention i HasConvention zostały wycofane
Nieprawidłowa i niespójna lokalizacja pliku w przypadku nowego interfejsu API przekształceń
Wtyczka Androida do obsługi Gradle nie powinna używać wycofanej funkcji GUtil.toWords(string)
Wtyczka Androida do Gradle nie powinna używać wycofanej funkcji ConfigureUtil.configure(closure, target)
Aktualizowanie testów AGP w celu korzystania z KGP w wersji 1.7.20-Beta
Błąd Gradle 7.4 (nie udało się utworzyć instancji AnalyticsService)
Nowy błąd „unknown enum constant” z kompilatora javac w AGP 7.4.0-alpha09
Konfiguracja MergeGeneratedProguardFilesCreationAction działa wolno nawet przy włączonym buforowaniu konfiguracji
[AGP] Dodawanie wygenerowanego katalogu źródłowego do modelu IDE (interfejs API wariantów)
JavaPluginConvention i HasConvention zostały wycofane
Nie dodawaj domyślnie ignorewarnings do R8
Ostrzeganie, gdy pliki ProGuard nie istnieją
Wtyczka Androida do obsługi Gradle w wersji 7.3.0 powoduje przerwanie synchronizacji Gradle w projektach platformy Gradle
Biblioteka apksig: metoda ApkVerifier$Result.getV4SchemeSigners() jest oznaczona jako prywatna
Przestań tworzyć konfigurację androidJacocoAnt, jeśli nie jest włączone pokrycie
Użycie adnotacji @IntDef w komponencie biblioteki nie powoduje wygenerowania pliku annotations.zip w pliku AAR
Nie udało się znaleźć wspólnego typu nadrzędnego dla i
Dodaj wersję właściwości Gradle LINT_PRINT_STACKTRACE=true
Nieaktualne artefakty prefabrykowane są pakowane do AAR
Przenoszenie z usługi docelowej do usługi outputLocation w celu wyeliminowania ostrzeżenia o wycofaniu i przygotowania się na Gradle 9.0
Uwzględnianie flagi `--release` podczas konfigurowania zadania JavaCompile
[AGP-7.3.0-beta03] Zadanie ShrinkResourcesNewShrinkerTask nie powiodło się, gdy po deklaracji XML występuje pusty wiersz
Domyślne uruchamianie zadania lintVital w wariancie debugowania
Ostrzeganie, gdy pliki ProGuard nie istnieją
AGP próbuje dodać kotlinOptions.freeCompilerArgs w fazie wykonywania zadania
Synchronizacja Gradle nie powiodła się: nie udało się zsynchronizować: nieznana przyczyna
Zadanie DependencyReportTask jest niezgodne z pamięcią podręczną konfiguracji
Zastępowanie zasobów za pomocą resValue w pliku build.gradle powoduje błąd: Duplicate resources
Typ kompilacji „debug” ma domyślny klucz podpisywania, a pozostałe nie.
Używanie funkcji dynamicznych i zmniejszanie zasobów powoduje awarię w czasie działania
Typ kompilacji „debug” ma domyślny klucz podpisywania, a pozostałe nie.
wygenerowany katalog źródłowy wymieniony jako katalog Java w głównym dostawcy źródła modelu lint;
Gradle 8.0-milestone-2 powoduje wyjątek w AGP
Optymalizacja scalania plików manifestu w przypadku aplikacji i bibliotek
Dodawanie gradle-settings-api do generowania dokumentacji Javadoc
Nowy błąd „unknown enum constant” z kompilatora javac w AGP 7.4.0-alpha09
AGP 7.4.0-alpha09 generuje kompilacje, których nie można przesłać do Firebase App Distribution
Plik lint.xml w modułach nie jest brany pod uwagę podczas sprawdzania, czy zadania Lint są aktualne
Problem z wtyczką Androida do obsługi Gradle w wersji 7.0 lub nowszej i testami Androida: nie można znaleźć zasobu: id
configureCMakeDebug sporadycznie ulega awarii z wyjątkiem wskaźnika o wartości null
Błąd IllegalAccessError podczas uaktualniania projektu do AS2022.2.1.5, FireBasePerfPlugin
Synchronizacja kończy się niepowodzeniem z tajemniczym błędem „Collection contains no element matching the predicate.”
Interfejs Instrumentation API nie przekształca zależności plików lokalnych
Błąd „`AnnotationProcessorOptions.arguments are queried`” podczas aktualizacji do wersji 7.4 Beta 1
Przeniesienie publicznych wtyczek Gradle do gradle-api i usunięcie BasePlugin.getExtension
Argumenty r8.jvmArgs nie są używane
Wtyczka Androida do obsługi Gradle wymaga JDK17 jako minimalnej wersji
AGP 8.0.0 A8 powoduje problemy z profilami podstawowymi
Zmiana „compileSdkVersion” na „compileSdk” w komunikacie CheckAarMetadataTask w AGP 8.0
Wtyczka Androida do obsługi Gradle w wersji 7.4.0-rc01 powoduje błąd w interfejsie Variant API z komunikatem „Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported” (Zapytanie o zmapowaną wartość mapy(dostawcy(java.util.Set)) przed ukończeniem zadania „...” nie jest obsługiwane).
Problemy z pamięcią podręczną konfiguracji w przypadku `com.android.build.gradle.tasks.ShaderCompile`
Dodawanie do zasobów Java za pomocą interfejsów AGP API powoduje uszkodzenie pamięci podręcznej konfiguracji
Wtyczka Lint nie jest częścią interfejsu Gradle API
DexingFileDependenciesTask.outputKeepRules to katalog, ale jest oznaczony jako OutputFile
Uaktualnienie do AGP 7.4 powoduje błąd StackOverflowError
processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu w przypadku wariantów testowych
Lint uzyskuje dostęp do informacji o zestawach źródeł bez zależności
Błąd kompilacji odnosi się do poziomu API 34, który nie istnieje
„Zalecamy użycie nowszego wtyczki Androida do Gradle”, gdy nie ma nowszej wersji
android.injected.testOnly=false nie działa
Dexer (D8)
Błąd scalania plików Dex związany z globalnymi syntetykami po uaktualnieniu AS Canary z wersji 6 do 7
Aktualizacja biblioteki metadanych Kotlin do wersji 0.6.0
Obejście problemu JDK-8272564 wydaje się wymagane w przypadku interfejsu API na poziomie 28–30
Lint
Sprawdzanie kodu ResourceType nie działa w przypadku źródeł w języku Kotlin
VersionChecks nie obsługuje sprawdzania zakresu w języku Kotlin
Fałszywie pozytywny wynik w przypadku funkcji InlinedApi, gdy jest ona opakowana
Fałszywie dodatni błąd narzędzia Lint Recycle dotyczący openInputStream
[BuildTool/Lint] ChecksSdkIntAtLeast constructor property
Lint: scalanie PartialResults działa nieprawidłowo
Android Studio nieprawidłowo oznacza określoną wersję jako nieaktualną.
Usługa AndroidDeprecationInspection.DeprecationFilter EP nigdy nie jest rejestrowana w pliku android-plugin.xml
Wyjaśnienie kontroli lint AccessibilityDetector jest nieaktualne
Sprawdzanie Lint SDK_INT powinno uwzględniać tymczasowe zmienne lokalne
Błąd podczas zastępowania typu funkcji przez alias typu w przypadku TestMode.TYPE_ALIAS
Błąd: gdy obiekt ObjectAnimator jest tworzony poza bieżącym blokiem kodu, pojawiają się fałszywe ostrzeżenia o jego nieuruchomieniu #38
Lint: NPE due to querying Application instance in mergeOnly mode
Reguła lint NonConstantResourceId nie może wykryć przypisania stałych wartości z identyfikatora zasobu
nie wyświetla błędu w przypadku identyfikatora widoku
Niepowodzenie deserializacji pamięci podręcznej zasobów lint powoduje błąd lint (ale powinno być ostrzeżeniem)
AGP Flamingo Alpha 8 Lint NewApi Desugar Regression
TypedArray#close (API 31) nie jest przekształcany, ale AS nie wyświetla ostrzeżenia, gdy jest używany w instrukcji try-with-resources
Lint nie sprawdza prawidłowych rzutowań odbiorców połączeń
Narzędzie Lint sprawdza tylko bezpieczne rzutowania w przypadku interfejsów zaimplementowanych bezpośrednio, a nie tych odziedziczonych.
Integracja z Lint
Plik bazowy jest obecnie danymi wejściowymi i wyjściowymi zadań Lint.
Shrinker (R8)
Błąd NPE lub błąd asercji w weryfikatorze ramki CF
Regresja po usunięciu pamięci podręcznej wyszukiwania pól
`:app:minifyVariantWithR8` zgłasza wyjątek NullPointerException w AGP 7.4.0-beta02
R8: ClassNotFoundException przy użyciu opcji -allowaccessmodification
Dodawanie obsługi odbiorców kontekstu w metadanych
java.lang.VerifyError: Verifier rejected class androidx.compose.ui.graphics.colorspace.o: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object) failed to verify: void androidx.compose.ui.graphics.colorspace.o.(java.lang.Object): [0x0] cannot access instance field java.lang.Object androidx.compose.ui.graphics.colorspace.n.a from object of type Precise Reference: androidx.compose.ui.graphics.colorspace.o
AGP 7.4.0/7.3.1 – próba umieszczenia działania w nieobsługującej umieszczania w kolejce liście zadań
Zmniejszanie kodu Renderscript: znaczny spadek wydajności po uaktualnieniu wtyczki Androida do obsługi Gradle z wersji 7.3.1 do 7.4.0