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ść

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

Kotlin DSL jest domyślnym językiem w przypadku konfiguracji kompilacji

Nowe projekty domyślnie używają teraz do konfiguracji kompilacji języka DSL w Kotlinie (build.gradle.kts). Dzięki temu edytowanie jest łatwiejsze niż w przypadku Groovy DSL (build.gradle) i zawiera podświetlanie składni, uzupełnianie kodu i przechodzenie do deklaracji. Pamiętaj, że jeśli używasz AGP 8.1 i Kotlin DSL do konfiguracji kompilacji, dla najlepszej wydajności powinieneś użyć Gradle 8.1. Więcej informacji znajdziesz w przewodniku po migracji kodu Kotlin DSL.

Automatyczna obsługa języka według aplikacji

Począwszy od wersji Giraffe Canary 7 Android Studio i AGP 8.1.0-alpha07 możesz skonfigurować aplikację tak, aby automatycznie obsługiwała ustawienia języka na poziomie aplikacji. Na podstawie zasobów projektu wtyczka Androida do obsługi Gradle generuje plik LocaleConfig i dodaje do niego odwołanie w pliku manifestu końcowego, dzięki czemu nie musisz już tego robić ręcznie. AGP korzysta z zasobów w folderach res w modułach aplikacji oraz z zależnych modułów bibliotek, aby określić języki, które mają się znaleźć w pliku LocaleConfig.

Pamiętaj, że funkcja automatycznego tłumaczenia języka w aplikacji obsługuje aplikacje na Androida w wersji 13 (poziom API 33) lub nowszej. Aby korzystać z tej funkcji, musisz ustawić parametr compileSdkVersion na 33 lub wyższy. Aby skonfigurować ustawienia języka według aplikacji w poprzednich wersjach Androida, musisz nadal 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ślny język:

  1. W folderze res modułu aplikacji utwórz nowy plik o nazwie resources.properties.
  2. W pliku resources.properties ustaw domyślny język za pomocą etykiety unqualifiedResLocale. Aby utworzyć nazwy języków, połącz kod języka z opcjonalnymi kodami pisma i regionów, oddzielając je kreską:

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

        unqualifiedResLocale=en-US
        

AGP dodaje ten domyślny region oraz wszystkie alternatywne regiony, które zostały określone przez Ciebie za pomocą 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 {} w pliku build.gradle.kts na poziomie modułu (plik build.gradle, jeśli używasz Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint zawiera kod bajtowy kierowany na JVM 17

Począwszy od wersji AGP 8.1.0-alpha04 Android Lint zawiera kod bajtowy kierowany do JVM 17. Jeśli piszesz niestandardowe kontrole lint, musisz skompilować kod za pomocą JDK 17 lub nowszej wersji i w opcjach kompilatora Kotlin określić parametr jvmTarget = '17'.

Więcej informacji o narzędzie do sprawdzania kodu znajdziesz w artykule Ulepszanie kodu za pomocą kontroli kodu.

Ustawienie kompresji bibliotek natywnych zostało przeniesione do DSL

Od wersji AGP 8.1.0-alpha10 w przypadku braku skonfigurowania kompresji biblioteki natywnej za pomocą DSL zamiast pliku manifestu wyświetlane jest ostrzeżenie. Z tych wskazówek dowiesz się, jak zaktualizować konfigurację, aby korzystać z DSL. Aby uzyskać pomoc w przeprowadzaniu tych aktualizacji, skorzystaj z asystenta uaktualniania AGP (Narzędzia > Asystent uaktualniania AGP).

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

Kotlin

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

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Flagi wersji eksperymentalnej

Są to eksperymentalne flagi do konfigurowania wersji dostępnej w AGP 8.1.

Zgłoś Dodano w Wartość domyślna Uwagi
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Włączenie tej opcji bez określonej konfiguracji podpisywania spowoduje, że AGP użyje domyślnej konfiguracji podpisywania podczas uruchamiania wersji z możliwością profilowania lub debugowania. Ten parametr jest domyślnie wyłączony, aby zachęcić autorów kompilacji do deklarowania konkretnych konfiguracji podpisywania profilowania.
android.experimental.library.desugarAndroidTest AGP 8.0 false Ten parametr umożliwia twórcom bibliotek włączanie desugaringu biblioteki podstawowej w przypadku testowych plików APK bez wpływu na wygenerowany plik AAR, na przykład poprzez linting. W przyszłości planujemy wprowadzić obsługę tego zachowania w interfejsie Variant API.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Jeśli ta opcja jest włączona, Gradle Managed Devices umożliwia użycie przez użytkownika niestandardowego typu urządzenia, który może być udostępniany przez wtyczkę. Ta flaga musi być włączona, jeśli chcesz używać wtyczki Laboratorium testów Firebase.
android.lint.printStackTrace AGP 8.0 false Jeśli ta opcja jest włączona, Android Lint wypisuje ślad stosu w przypadku awarii. Ten parametr ma te same możliwości co zmienna środowiskowa LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Brak Określa maksymalną liczbę jednoczesnych urządzeń zarządzanych przez Gradle (AVD), które mogą być aktywne w danym momencie. Jeśli wartość jest równa 0 lub ujemna, nie ma maksymalnej liczby urządzeń.
android.experimental.testOptions.installApkTimeout AGP 8.0 Brak Czas oczekiwania na zainstalowanie pliku APK (w sekundach). Jeśli wartość jest równa 0 lub ujemna, zostanie zastąpiona przez UTP wartością domyślną.

Rozwiązane problemy

Wtyczka Androida do obsługi Gradle 8.1.0

Rozwiązane problemy
Wtyczka Gradle na Androida
Problemy z modułem „com.android.build.gradle.tasks.ShaderCompile” dotyczące pamięci podręcznej konfiguracji
Dodawanie do zasobów Java za pomocą interfejsów AGP powoduje błąd pamięci podręcznej konfiguracji
[Android Studio : Flamingo | 2022.2.1 Canary 8] Plik liblog.so jest zapakowany w pliku APK
KGP odczytuje plik manifestu podczas konfiguracji, unieważniając pamięć podręczną konfiguracji po zmianie pliku manifestu.
Niejasny komunikat ostrzegawczy w procesie kompilacji w przypadku problemu w złączonym pliku manifestu
Uaktualnienie do wersji AGP 7.4 powoduje błąd StackOverflowError
Wyjątek ClassNotFoundException w funkcji dynamicznej, która zależy bezpośrednio od podprojektu biblioteki Kotlin
Funkcja processDebugUnitTestManifest nie działa prawidłowo w przypadku obiektów zastępczych w pliku manifestu dla wariantów testowych
Funkcja processDebugUnitTestManifest nie działa prawidłowo w przypadku obiektów zastępczych w pliku manifestu dla wariantów testowych
Właściwość namespace prawdopodobnie należy do elementu HasAndroidResources
Nie można wyłączyć komunikatu „Pliki Gradle zmieniły się od ostatniej synchronizacji projektu”
„Zalecamy użycie nowszego wtyczki Gradle dla Androida”, gdy nie ma nowszego
Funkcja processDebugUnitTestManifest nie działa prawidłowo w przypadku obiektów zastępczych w pliku manifestu dla wariantów testowych
Flaga logiczna do wyłączania sprawdzania pakietu SDK w ramach zadania 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 JavaCompile
Wpisy precyzyjnych linków nawigacji z domenami z symbolami wieloznacznymi nie mają atrybutu `android:host` w złączonym pliku manifestu
W wersji 8.1 wtyczki Androida do obsługi Gradle zadanie processDebugMainManifest się nie udaje.
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 JavaCompile
Wpisy precyzyjnych linków nawigacji z domenami z symbolami wieloznacznymi nie mają atrybutu `android:host` w złączonym pliku manifestu
W wersji 8.1 wtyczki Androida do obsługi Gradle zadanie processDebugMainManifest się nie udaje.
Android Studio nie uwzględnia zmiennej środowiskowej STUDIO_GRADLE_JDK
Typy niestandardowych źródeł powinny tworzyć źródła o wielu smakach
DependenciesInfoBuilder wymaga aktualizacji interfejsu API i dokumentacji
DexingNoClasspathTransform (minSdk >= 24) z obiektem Java 11 kończy się niepowodzeniem z powodu braku elementów zagnieżdżonych
DslExtension.Builder.extendProjectWith() nie działa zgodnie z opisem w Groovy
Dodaj interfejs API VariantSelector.withFlavor, który nie używa kotlin.Pair
Proces AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) nie znalazł danych w pamięci podręcznej, ponieważ plik „proguard.txt” uległ zmianie
Złączony plik manifestu aplikacji zawiera atrybuty extractNativeLibs i useEmbeddedDex z zależnych bibliotek
AGP: udostępnienie ścieżki do narzędzia AIDL i pliku AIDL frameworku jako publicznego interfejsu API
Prośba: umożliwienie IDE proponowane rozwiązanie problemu „PermittedSubclasses requires ASM9”
Błąd: opcja „Enable KSP and use the KSP processor for this dependency instead” (Włącz KSP i użyj procesora KSP dla tej zależności) prowadzi tylko do strony internetowej
Gradle 8.1 powoduje przerwanie buforowania konfiguracji z powodu pliku .gradle/.android/analytics.settings
Funkcja generateLocaleConfig w wersji agp 8.1.0 używa niedeterministycznego sortowania, co powoduje niemożność tworzenia kompilacji powtarzalnych
Dexer (D8)
Aplikacja ulega awarii po ostatnich aktualizacjach z powodu desugaringu w bibliotece podstawowej.
agp 8.1.0 regresja z API 21 – F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Sprawdź, czy nie udało się: !method->IsAbstract()
Lint
Lint sprawdza bezpieczne konwersje tylko w przypadku bezpośrednio zaimplementowanych interfejsów, a nie dziedziczonych
Lint nie sprawdza prawidłowych typów danych w przypadku odbiorców wywołania
TypedArray#close (interfejs API 31) nie został odsłodzony, ale AS nie wyświetla ostrzeżenia, gdy metoda jest używana w ramach instrukcji try-with-resources
Błąd: fałszywie pozytywne ostrzeżenie „Dostawca 'BC' został wycofany i od Androida P...”.
Fałszywie pozytywny wynik Lint dotyczący funkcji remember po uaktualnieniu Kotlina do wersji 1.8.0
Nieprawidłowe ostrzeżenie Lint w przypadku sprawdzeń SDK_INT wykonywanych w ramach metody z parametrem enum
TypographyQuotesLintCheck nie działa w przypadku cudzysłowów ujętych w znaki skoku.
Weryfikacja TrustAllX509TrustManager w lint nieprawidłowo oznacza interfejsy rozszerzające X509TrustManager
Przeformatowanie tylko wstawionych poprawek kodu w ramach zastąpienia
Lint: zamiana tekstu w intencji powoduje wyjątek w przypadku ReplaceStringQuickFix
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
R8 na AGP 8 powoduje błąd usługi Google Fit
Podanie informacji o pliku źródłowym z nazwami resztek, które pokrywają się z nazwami wejściowymi, nie jest prawidłowo wyświetlane
R8 nie tworzy kompilacji Compose z wyjątkiem ArrayIndexOutOfBoundsException
Kod związany z prostą klasą StringBuilder nie zawiera wywołania dodawania na końcu w wersji produkcyjnej ani w trybie debuggable=false
Wyjątkowy przypadek w metodzie VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization powoduje błąd java.lang.VerifyError: Rejecting class
Awaria z błędem weryfikacji na Androidzie 12 i nowszych

Wtyczka Androida do obsługi Gradle 8.1.1

Rozwiązane problemy
Dexer (D8)
Java 16 Records: equals(null) throws NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
Kompilacja utknęła na etapie :minifyReleaseWithR8 podczas używania biblioteki Apache POI
Odrzucanie wywołania podczas włączania optymalizacji r8
NoClassDefFoundError dla java.lang.reflect.Executable

Wtyczka Androida do obsługi Gradle 8.1.2

Rozwiązane problemy
Wtyczka Gradle na Androida
androidResources jest niedostępny w module biblioteki Androida
[AGP 8.1.0] ./gradlew test fails with "Unable to find manifest output" if both splits.abi.isEnable and testOptions.unitTests.isIncludeAndroidResources are true
Shrinker (R8)
Kotlin 1.9 powoduje, że funkcje anonimowe Kotlina są usuwane przez R8, jeśli usunięto nullchecks
R8 nie działa z kompilacją z powodu „Nieokreślona wartość podczas kompilacji” w przypadku play-services-measurement-21.3.0-runtime.jar

Wtyczka Androida do obsługi Gradle 8.1.3

Rozwiązane problemy
Wtyczka Gradle na Androida
[AGP 8.1.0] ./gradlew test fails with "Unable to find manifest output" if both splits.abi.isEnable and testOptions.unitTests.isIncludeAndroidResources are true
Nieudana kompilacja po aktualizacji do AGP 8.1

Wtyczka Androida do obsługi Gradle 8.1.4

Rozwiązane problemy
Wtyczka Gradle na Androida
Nie uruchamiaj zadania dekompilacji w przypadku klas w podprojektach, które zostały już zdekompilowane w ramach przekształceń artefaktów