Wtyczka Androida do obsługi Gradle 8.1.0 (lipiec 2023 r.)

Wtyczka Androida do obsługi Gradle w wersji 8.1.0 to duża aktualizacja, 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 33.0.1 33.0.1 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.

Kotlin DSL jest domyślnym językiem konfiguracji kompilacji

W nowych projektach do konfiguracji kompilacji domyślnie używany jest język Kotlin DSL (build.gradle.kts). Zapewnia to lepsze wrażenia podczas edytowania niż Groovy DSL (build.gradle) dzięki wyróżnianiu składni, uzupełnianiu kodu i nawigacji do deklaracji. Jeśli używasz AGP 8.1 i Kotlin DSL do konfiguracji kompilacji, dla najlepszych wrażeń zalecamy używanie Gradle 8.1. Więcej informacji znajdziesz w przewodniku po migracji do Kotlin DSL.

Automatyczna obsługa języka według aplikacji

Od wersji Androida Studio Giraffe Canary 7 i AGP 8.1.0-alpha07 możesz automatycznie skonfigurować aplikację tak, aby obsługiwała ustawienia języka. Na podstawie zasobów projektu wtyczka Androida do obsługi Gradle generuje plik LocaleConfig i dodaje do niego odwołanie w końcowym pliku manifestu, więc nie musisz już tego robić ręcznie. AGP korzysta z zasobów w folderach res modułów aplikacji i wszelkich zależności modułów biblioteki, aby określić, które ustawienia regionalne mają być uwzględnione w pliku LocaleConfig.

Pamiętaj, że funkcja automatycznego ustawiania języka dla poszczególnych aplikacji jest obsługiwana w przypadku aplikacji działających na Androidzie 13 (API na poziomie 33) lub nowszym. Aby korzystać z tej funkcji, musisz ustawić wartość compileSdkVersion na co najmniej 33. Aby skonfigurować wybór języka według aplikacji w starszych wersjach Androida, nadal musisz używać interfejsów API i selektorów języka w aplikacji.

Aby włączyć automatyczną obsługę języka w poszczególnych aplikacjach, określ domyślne ustawienia regionalne:

  1. W folderze res modułu aplikacji utwórz nowy plik o nazwie resources.properties.
  2. W pliku resources.properties ustaw domyślne ustawienia regionalne za pomocą etykiety unqualifiedResLocale. Aby utworzyć nazwy ustawień regionalnych, połącz kod języka z opcjonalnymi kodami skryptu i regionu, oddzielając je myślnikiem:

    Jeśli na przykład domyślnym językiem jest angielski (Stany Zjednoczone):

        unqualifiedResLocale=en-US
        

AGP dodaje ten domyślny region i wszystkie określone przez Ciebie regiony alternatywne, korzystając z katalogów values-* w folderze res, do automatycznie wygenerowanego pliku LocaleConfig.

Automatyczne obsługiwanie języka w poszczególnych aplikacjach jest domyślnie wyłączone. Aby włączyć tę funkcję, użyj ustawienia generateLocaleConfig w bloku androidResources {} pliku build.gradle.kts na poziomie modułu (pliku build.gradle, jeśli używasz Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint zawiera kod bajtowy przeznaczony dla JVM 17

Od wersji AGP 8.1.0-alpha04 narzędzie Android Lint zawiera kod bajtowy przeznaczony dla JVM 17. Jeśli piszesz niestandardowe testy lint, musisz skompilować je za pomocą JDK 17 lub nowszej wersji i określić jvmTarget = '17' w opcjach kompilatora Kotlin.

Więcej informacji o narzędziu lint znajdziesz w artykule Ulepszanie kodu za pomocą sprawdzania lint.

Ustawienie kompresji biblioteki natywnej przeniesione do DSL

Od wersji AGP 8.1.0-alpha10 będziesz otrzymywać ostrzeżenie, jeśli nie skonfigurujesz kompresji biblioteki natywnej za pomocą DSL zamiast pliku manifestu. Poniższe wskazówki wyjaśniają, jak zaktualizować konfigurację, aby używać DSL. Aby uzyskać pomoc w wprowadzaniu tych zmian, użyj Asystenta uaktualniania AGP (Narzędzia > Asystent uaktualniania AGP).

Aby używać nieskompresowanych bibliotek natywnych, usuń atrybut android::extractNativeLibs z pliku manifestu i dodaj poniższy kod do pliku build.gradle.kts na poziomie modułu (pliku build.gradle, jeśli używasz Groovy):

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Flagi kompilacji eksperymentalnej

Są to eksperymentalne flagi do konfigurowania kompilacji dostępne w AGP 8.1.

Zgłoś Dodano w Wartość domyślna Uwagi
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Włączenie tej opcji bez podania konfiguracji podpisywania powoduje, że AGP używa domyślnej konfiguracji podpisywania debugowania podczas uruchamiania kompilacji z możliwością profilowania lub debugowania. Ta flaga jest domyślnie wyłączona, aby zachęcić autorów kompilacji do deklarowania konkretnych konfiguracji podpisywania profilowania.
android.experimental.library.desugarAndroidTest AGP 8.0 false Ta flaga umożliwia twórcom bibliotek włączenie desugaryzacji biblioteki podstawowej w przypadku testowych plików APK bez wpływu na wygenerowany plik AAR, np. przez linting. W przyszłości planujemy wprowadzić obsługę tego działania w interfejsie Variant API.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Jeśli ta opcja jest włączona, zarządzane urządzenia Gradle umożliwiają zdefiniowanie przez użytkownika niestandardowego typu urządzenia, który może być dostarczony przez wtyczkę. Ta flaga musi być włączona, jeśli chcesz używać wtyczki Laboratorium Firebase.
android.lint.printStackTrace AGP 8.0 false Jeśli ta opcja jest włączona, w przypadku awarii narzędzie Android Lint wyświetli ślad stosu. Ten flag ma takie same możliwości jak zmienna środowiskowa LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Brak Określa maksymalną liczbę równoczesnych urządzeń zarządzanych przez Gradle (AVD), które mogą być aktywne w danym momencie. Jeśli wartość wynosi 0 lub jest ujemna, nie ma maksymalnej liczby urządzeń.
android.experimental.testOptions.installApkTimeout AGP 8.0 Brak Czas oczekiwania w sekundach na zainstalowanie pliku APK. Jeśli wartość jest ujemna lub równa 0, UTP ustawi wartość domyślną.

Rozwiązane problemy

Wtyczka Androida do obsługi Gradle w wersji 8.1.0

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
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
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so jest spakowany w pliku APK
KGP odczytuje plik manifestu podczas konfiguracji, unieważniając pamięć podręczną konfiguracji po zmianie pliku manifestu.
Niejasny komunikat ostrzegawczy podczas kompilacji, gdy występuje problem w scalonym pliku manifestu
Uaktualnienie do AGP 7.4 powoduje błąd StackOverflowError
ClassNotFoundException w module dynamicznym, który jest bezpośrednio zależny od podprojektu biblioteki Kotlin
processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu w przypadku wariantów testowych
processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu w przypadku wariantów testowych
Właściwość przestrzeni nazw prawdopodobnie należy do HasAndroidResources
Nie można wyłączyć komunikatu „Pliki Gradle zostały zmienione od ostatniej synchronizacji projektu”
„Zalecamy użycie nowszego wtyczki Androida do Gradle”, gdy nie ma nowszej wersji
processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu w przypadku wariantów testowych
Flaga logiczna wyłączająca sprawdzanie pakietu SDK kompilacji w CheckAarMetadataTask
Błąd kompilacji odnosi się do poziomu API 34, który nie istnieje
Ustawienie łańcucha narzędzi JVM nie ma wpływu na wartość targetCompatibility w przypadku elementu docelowego JavaCompile
W przypadku wpisów deepLink nawigacji z domenami z symbolami wieloznacznymi w scalonym manifeście nie ma atrybutu `android:host`
Zadanie processDebugMainManifest nie powiodło się, ponieważ wtyczka Androida do obsługi Gradle w wersji 8.1
Czy możemy usunąć AnalyticsRecordingTask?
Treść pliku output-metadata.json jest niespójna
Czy możemy usunąć AnalyticsRecordingTask?
Treść pliku output-metadata.json jest niespójna
Ustawienie łańcucha narzędzi JVM nie ma wpływu na wartość targetCompatibility w przypadku elementu docelowego JavaCompile
W przypadku wpisów deepLink nawigacji z domenami z symbolami wieloznacznymi w scalonym manifeście nie ma atrybutu `android:host`
Zadanie processDebugMainManifest nie powiodło się, ponieważ wtyczka Androida do obsługi Gradle w wersji 8.1
Android Studio nie uwzględnia zmiennej środowiskowej STUDIO_GRADLE_JDK
Niestandardowe typy źródeł powinny tworzyć zestawy źródeł o różnych wersjach
DependenciesInfoBuilder wymaga aktualizacji interfejsu API i dokumentacji
DexingNoClasspathTransform (minSdk >= 24) z Java 11 kończy się niepowodzeniem z powodu braku zagnieżdżonych elementów
DslExtension.Builder.extendProjectWith() nie działa zgodnie z opisem w Groovy
Dodanie interfejsu API VariantSelector.withFlavor, który nie używa kotlin.Pair
Zadanie AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) nie znalazło danych w pamięci podręcznej, ponieważ plik „proguard.txt” został zmieniony
Scalony manifest aplikacji zawiera atrybuty extractNativeLibs i useEmbeddedDex z zależności
AGP: udostępnianie ścieżki do narzędzia AIDL i pliku AIDL platformy jako publicznego interfejsu API
Żądanie: pozwól IDE zaproponować rozwiązanie problemu „PermittedSubclasses wymaga ASM9”
Błąd: „Enable KSP and use the KSP processor for this dependency instead” (Włącz KSP i użyj procesora KSP dla tej zależności) przekierowuje do witryny
Gradle 8.1 powoduje przerwanie buforowania konfiguracji z powodu pliku .gradle/.android/analytics.settings
Funkcja generateLocaleConfig w AGP 8.1.0 używa niedeterministycznego porządkowania, co uniemożliwia tworzenie powtarzalnych kompilacji.
Dexer (D8)
Desugaryzacja biblioteki podstawowej powoduje awarię aplikacji po ostatnich aktualizacjach.
agp 8.1.0 regression with API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
Narzędzie Lint sprawdza bezpieczne rzutowanie tylko w przypadku interfejsów zaimplementowanych bezpośrednio, a nie tych odziedziczonych.
Lint nie sprawdza prawidłowych rzutowań odbiorców wywołań
TypedArray#close (API 31) nie jest przekształcany, ale AS nie wyświetla ostrzeżenia, gdy jest używany w bloku try-with-resources
Błąd: fałszywie pozytywne ostrzeżenie „Dostawca „BC” został wycofany i od Androida P...”.
Fałszywie pozytywny wynik narzędzia Lint dotyczący funkcji remember po aktualizacji Kotlina do wersji 1.8.0
Fałszywy alarm narzędzia Lint dotyczący sprawdzania SDK_INT w metodzie z parametrem wyliczeniowym
Sprawdzanie stylu TypographyQuotes nie działa w przypadku cudzysłowów z sekwencją ucieczki
Sprawdzanie lint TrustAllX509TrustManager nieprawidłowo oznacza interfejsy, które rozszerzają X509TrustManager
Ponowne formatowanie tylko wstawionego kodu poprawki zastępującej
Lint: podgląd intencji zgłasza wyjątek w przypadku ReplaceStringQuickFix
Shrinker (R8)
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.
R8 kończy się niepowodzeniem podczas kompilacji Compose z błędem ArrayIndexOutOfBoundsException
Prosty kod związany z klasą StringBuilder nie zawiera wywołania ogonowego dołączania w trybie wydania lub debuggable=false
Przypadek brzegowy w metodzie VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization powoduje błąd java.lang.VerifyError: Rejecting class
Aplikacja ulega awarii z błędem weryfikacji na urządzeniach z Androidem 12 lub nowszym

Wtyczka Androida do obsługi Gradle w wersji 8.1.1

Rozwiązane problemy
Dexer (D8)
Java 16 Records: equals(null) zgłasza wyjątek NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
Podczas korzystania z biblioteki Apache POI kompilacja zawiesza się na etapie :minifyReleaseWithR8
Odrzucanie wywołania, gdy włączona jest optymalizacja R8
Błąd NoClassDefFoundError w przypadku java.lang.reflect.Executable

Wtyczka Androida do obsługi Gradle w wersji 8.1.2

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
androidResources jest niedostępny w module biblioteki Androida
[AGP 8.1.0] ./gradlew test kończy się niepowodzeniem z błędem „Unable to find manifest output”, jeśli zarówno splits.abi.isEnable, jak i testOptions.unitTests.isIncludeAndroidResources mają wartość true
Shrinker (R8)
Kotlin 1.9 powoduje, że R8 usuwa lambdy Kotlin, jeśli usunięte zostaną sprawdzania wartości null
R8 kończy się niepowodzeniem z komunikatem „Undefined value encountered during compilation” (Podczas kompilacji wykryto niezdefiniowaną wartość) w przypadku pliku play-services-measurement-21.3.0-runtime.jar

Wtyczka Androida do obsługi Gradle w wersji 8.1.3

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
[AGP 8.1.0] ./gradlew test kończy się niepowodzeniem z błędem „Unable to find manifest output”, jeśli zarówno splits.abi.isEnable, jak i testOptions.unitTests.isIncludeAndroidResources mają wartość true
Błąd kompilacji po aktualizacji do AGP 8.1

Wtyczka Androida do obsługi Gradle w wersji 8.1.4

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
Nie uruchamiaj zadania dexing na klasach podprojektów, jeśli zostały już one przekształcone w artefakty.