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

Wtyczka Androida do obsługi Gradle w wersji 8.0.0 to ważna wersja, 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 sekcji Aktualizowanie Gradle.
SDK Build Tools 30.0.3 30.0.3 Zainstaluj lub skonfiguruj narzędzia do kompilacji pakietu SDK.
NDK Nie dotyczy 25.1.8937393 Zainstaluj lub skonfiguruj inną wersję NDK.
JDK 17 17 Więcej informacji znajdziesz w artykule o ustawianiu 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 zamkniętych zgłoszeniach dotyczących Androida 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] Nie udało się zweryfikować klasy na 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 testów 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 niektórych z 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ą języka DSL w projektach, w których jest ona potrzebna. Planujemy usunąć ten flag w AGP 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 w AGP 9.0.
android.nonFinalResIds true false AGP 8.0 domyślnie generuje R klasy z polami nieoznaczonymi jako final.
android.nonTransitiveRClass true false AGP 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 Tryb pełny 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 określisz je w pliku gradle.properties, wartość zostanie zignorowana, a AGP wyświetli ostrzeżenia.

Zgłoś Wymuszona wartość Uwagi
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 wyświetla ostrzeżenie, jeśli wykryje rozwiązanie konfiguracji w fazie konfiguracji, ponieważ ma to negatywny wpływ na czas konfiguracji Gradle.
android.r8.failOnMissingClasses true AGP 8.0 nie kompiluje projektów, które korzystają z R8, jeśli brakuje w nich klas, aby zapewnić lepszą optymalizację DEX. Aby rozwiązać ten problem, musisz dodać brakujące biblioteki lub -dontwarnzachować reguły-dontwarn. Więcej informacji znajdziesz w artykule Missing class warnings in R8 shrinker (Ostrzeżenia o brakujących klasach w narzędziu do zmniejszania kodu 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 mapowań względnych ścieżek zasobów, dzięki czemu kompilacje Gradle są częściej aktualizowane.
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 komponentu SoftwareComponent. Zamiast tego AGP tworzy elementy SoftwareComponent tylko w przypadku wariantów, które są skonfigurowane do publikowania za pomocą języka 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.

Przypisanie właściwości leniwej w języku Kotlin nie jest obsługiwane

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

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, Analizator kompilacji nie wyświetla zadań osobno, ale 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.

Wtyczka Nowe ustawienia

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 wykonywania narzędzi

Wtyczka ustawień umożliwia też tworzenie profili wykonawczych 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ć domyślny profil, 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 AGP 8.0 wymagany jest pakiet JDK 17

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

Jeśli musisz ręcznie ustawić wersję JDK używaną przez AGP w Android Studio, musisz użyć JDK 17 lub nowszego.

Jeśli używasz AGP niezależnie od Androida Studio, uaktualnij 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.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 1.7.20-Beta
Błąd Gradle 7.4 (nie udało się utworzyć instancji AnalyticsService)
Nowy „nieznany stały enum” z 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ą
AGP 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 kodu
Użycie adnotacji @IntDef w komponencie biblioteki nie powoduje wygenerowania pliku annotations.zip w pliku AAR
Nie udało się znaleźć wspólnego supertypu 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 lintVital w wersji 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 w wersji 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 „nieznany stały enum” z 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
JDK17 jako minimalna wersja wymagana w przypadku AGP
AGP 8.0.0 A8 powoduje problemy z profilami podstawowymi
Zmiana „compileSdkVersion” na „compileSdk” w komunikacie CheckAarMetadataTask w AGP 8.0
AGP 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ść map(provider(java.util.Set)) przed ukończeniem zadania „...” nie jest obsługiwane).
Problemy z pamięcią podręczną konfiguracji w przypadku zadania `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 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
Zaktualizuj bibliotekę 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
Wynik fałszywie pozytywny w przypadku funkcji InlinedApi, gdy jest ona opakowana
Lint false positive Recycle regarding openInputStream
[BuildTool/Lint] ChecksSdkIntAtLeast constructor property
Lint: scalanie PartialResults działa nieprawidłowo
Android Studio nieprawidłowo oznacza określoną wersję jako nieaktualną.
AndroidDeprecationInspection.DeprecationFilter EP nigdy nie jest rejestrowany 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 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,
Nieudana deserializacja pamięci podręcznej zasobów lint powoduje błąd lint (ale powinien to być komunikat ostrzegawczy)
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 bloku try-with-resources
Lint nie sprawdza prawidłowych rzutowań odbiorców wywołań
Narzędzie Lint sprawdza bezpieczne rzutowanie tylko w przypadku interfejsów zaimplementowanych bezpośrednio, a nie tych odziedziczonych.
Integracja z Lint
Plik podstawowy jest obecnie danymi wejściowymi i wyjściowymi zadań Lint.
Shrinker (R8)
Błąd NPE lub błąd asercji w weryfikatorze ramek 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 when -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 - Attempt to enqueue an action in a non pushable enqueuer work list
Minifikacja kodu Renderscript: znaczny spadek wydajności po przejściu z AGP w wersji 7.3.1 na wersję 7.4.0

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] Nie udało się zweryfikować klasy na Androidzie 11

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: weryfikator odrzucił klasę podczas korzystania z R8 w Kotlinie 1.8.20
R8 na 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.