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

Wtyczka Androida do obsługi Gradle w wersji 8.1.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 o aktualizowaniu Gradle.
Narzędzia do kompilacji pakietu SDK 33.0.1 33.0.1 Zainstaluj lub skonfiguruj narzędzia SDK do kompilacji.
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 konfigurowania 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 optymalnego działania 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 dla poszczególnych aplikacji. 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 używa zasobów z folderów res modułów aplikacji i wszelkich zależności modułów biblioteki, aby określić ustawienia regionalne, które mają być uwzględnione w pliku LocaleConfig.

Pamiętaj, że funkcja automatycznego ustawiania języka dla poszczególnych aplikacji obsługuje aplikacje działające na Androidzie 13 (poziom API 33) lub nowszym. Aby korzystać z tej funkcji, musisz ustawić wartość compileSdkVersion na 33 lub wyższą. 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ć automatyczne obsługiwanie 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 amerykański:

        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.

Automatyczna obsługa języka w poszczególnych aplikacjach jest domyślnie wyłączona. 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
  }
}

Dynamiczny

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 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 (plik build.gradle, jeśli używasz Groovy):

Kotlin

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

Dynamiczny

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Flagi kompilacji eksperymentalnej

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

Flaga Dodano w Wartość domyślna Uwagi
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Włączenie tej opcji bez określania 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 odlurkzania biblioteki podstawowej w przypadku testowych plików APK bez wpływu na wygenerowany plik AAR, np. przez lintowanie. Planujemy w przyszłości 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 aktywnych urządzeń zarządzanych przez Gradle (AVD). 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.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 ramach przekształceń artefaktów.

Wtyczka Androida do obsługi Gradle w wersji 8.1.3

Rozwiązane problemy
Wtyczka Androida do obsługi Gradle
[AGP 8.1.0] Test ./gradlew 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 uaktualnieniu do wtyczki Androida do obsługi Gradle w wersji 8.1

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] Test ./gradlew 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
Kompresor (R8)
Kotlin 1.9 powoduje, że R8 niszczy lambdy Kotlina, jeśli usunięte zostaną sprawdzania wartości null
R8 kończy się niepowodzeniem z błędem „Undefined value encountered during compilation” (Wykryto niezdefiniowaną wartość podczas kompilacji) w przypadku pliku play-services-measurement-21.3.0-runtime.jar

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
Kompresor (R8)
java.lang.VerifyError: klasa odrzucona przez weryfikator
Podczas korzystania z biblioteki Apache POI kompilacja zawiesza się na etapie :minifyReleaseWithR8
Odrzucanie wywołania, gdy włączona jest optymalizacja R8
NoClassDefFoundError dla java.lang.reflect.Executable

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 `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 APK
KGP odczytuje plik manifestu podczas konfiguracji, unieważniając pamięć podręczną konfiguracji po zmianie pliku manifestu.
Niejasny komunikat ostrzegawczy kompilacji podczas problemu w manifeście łączonym
Uaktualnienie do AGP 7.4 powoduje błąd StackOverflowError
ClassNotFoundException w funkcji dynamicznej, która jest bezpośrednio zależna od podprojektu biblioteki Kotlin
Zadanie processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu wariantów testowych
Zadanie processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu 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 nowszej wtyczki Androida do obsługi Gradle”, gdy nie ma nowszej wersji
Zadanie processDebugUnitTestManifest kończy się niepowodzeniem z obiektami zastępczymi w pliku manifestu wariantów testowych
Flaga logiczna wyłączająca sprawdzanie pakietu SDK kompilacji w CheckAarMetadataTask
Błąd kompilacji odnosi się do poziomu interfejsu API 34, który nie istnieje
Ustawienie łańcucha narzędzi JVM nie ma wpływu na wartość targetCompatibility w przypadku elementu docelowego JavaCompile
Wpisy deepLink nawigacji z domenami z symbolami wieloznacznymi nie mają w manifeście łączonym 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
Wpisy deepLink nawigacji z domenami z symbolami wieloznacznymi nie mają w manifeście łączonym 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 wielu 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
Funkcja 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” uległ zmianie
Manifest łączony 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 przerywa buforowanie 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()
Linter
Lint sprawdza bezpieczne rzutowania tylko w przypadku bezpośrednio zaimplementowanych interfejsów, a nie interfejsów dziedziczonych.
Lint nie sprawdza prawidłowych rzutowań w przypadku odbiorców wywołań
TypedArray#close (API 31) nie jest przekształcany, ale AS nie wyświetla ostrzeżenia, gdy jest używany w instrukcji try-with-resources
Błąd: fałszywie pozytywne ostrzeżenie „Dostawca „BC” został wycofany i od Androida P...”.
Fałszywie dodatni wynik lintera dotyczący funkcji remember po uaktualnieniu Kotlina do wersji 1.8.0
Fałszywie pozytywny wynik ostrzeżenia lintera dotyczący sprawdzania SDK_INT w metodzie z parametrem wyliczeniowym
Sprawdzanie kodu TypographyQuotes nie działa w przypadku znaków cudzysłowu 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
Kompresor (R8)
VerifyError: klasa odrzucona przez weryfikator 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.
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()
Optymalizacja uruchamiania DEX powoduje błąd java.lang.VerifyError: Rejecting class
Aplikacja ulega awarii z błędem weryfikacji na urządzeniach z Androidem 12 lub nowszym