Plug-in Android per Gradle 8.1.0 (luglio 2023)

Il plug-in Android per Gradle 8.1.0 è una release principale che include una serie di nuove funzionalità e miglioramenti.

Compatibilità

Versione minima Versione predefinita Note
Gradle 8,0 8,0 Per scoprire di più, consulta la sezione Aggiornare Gradle.
Strumenti di compilazione SDK 33.0.1 33.0.1 Installa o configura gli strumenti di creazione dell'SDK.
NDK N/D 25.1.8937393 Installa o configura una versione diversa dell'NDK.
JDK 17 17 Per saperne di più, vedi Impostare la versione di JDK.

Kotlin DSL è l'impostazione predefinita per la configurazione della build

Per impostazione predefinita, i nuovi progetti ora utilizzano Kotlin DSL (build.gradle.kts) per la configurazione della build. Offre un'esperienza di modifica migliore rispetto a Groovy DSL (build.gradle) con evidenziazione della sintassi, completamento del codice e navigazione alle dichiarazioni. Tieni presente che se utilizzi AGP 8.1 e Kotlin DSL per la configurazione della build, devi utilizzare Gradle 8.1 per un'esperienza ottimale. Per saperne di più, consulta la guida alla migrazione di Kotlin DSL.

Supporto automatico della lingua per app

A partire da Android Studio Giraffe Canary 7 e AGP 8.1.0-alpha07, puoi configurare la tua app per supportare automaticamente le preferenze di lingua per app. In base alle risorse del progetto, il plug-in Android per Gradle genera il file LocaleConfig e aggiunge un riferimento al file manifest finale, quindi non devi più farlo manualmente. AGP utilizza le risorse nelle cartelle res dei moduli dell'app e le dipendenze dei moduli della libreria per determinare le impostazioni internazionali da includere nel file LocaleConfig.

Tieni presente che la funzionalità di lingua automatica per app supporta le app che eseguono Android 13 (livello API 33) o versioni successive. Per utilizzare la funzionalità, devi impostare compileSdkVersion su 33 o un valore superiore. Per configurare le preferenze della lingua per app per le versioni precedenti di Android, devi comunque utilizzare le API e i selettori della lingua in-app.

Per attivare il supporto automatico della lingua per app, specifica un locale predefinito:

  1. Nella cartella res del modulo dell'app, crea un nuovo file denominato resources.properties.
  2. Nel file resources.properties, imposta le impostazioni internazionali predefinite con l'etichetta unqualifiedResLocale. Per formare i nomi delle impostazioni internazionali, combina il codice lingua con i codici facoltativi di script e regione, separando ciascun codice con un trattino:

    • Lingua: utilizza il codice ISO 639-1 di due o tre lettere.
    • Script (facoltativo): utilizza il codice ISO 15924.
    • Regione (facoltativo): utilizza il codice ISO 3166-1 alpha-2 a due lettere o il codice UN_M.49 a tre cifre.

    Ad esempio, se la lingua predefinita è l'inglese americano:

        unqualifiedResLocale=en-US
        

AGP aggiunge questa impostazione internazionale predefinita e tutte le impostazioni internazionali alternative che hai specificato, utilizzando le directory values-* nella cartella res, al file LocaleConfig generato automaticamente.

Il supporto automatico della lingua per app è disattivato per impostazione predefinita. Per attivare la funzionalità, utilizza l'impostazione generateLocaleConfig nel blocco androidResources {} del file build.gradle.kts a livello di modulo (file build.gradle se utilizzi Groovy):

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint contiene bytecode che hanno come target la JVM 17

A partire da AGP 8.1.0-alpha04, Android Lint contiene bytecode che ha come target la JVM 17. Se scrivi controlli lint personalizzati, devi compilare con JDK 17 o versioni successive e specificare jvmTarget = '17' nelle opzioni del compilatore Kotlin.

Per scoprire di più sullo strumento di analisi statica del codice, consulta la pagina Migliorare il codice con i controlli lint.

L'impostazione di compressione della libreria nativa è stata spostata in DSL

A partire da AGP 8.1.0-alpha10, riceverai un avviso se non configuri la compressione della libreria nativa utilizzando il DSL anziché il manifest. Le seguenti indicazioni spiegano come aggiornare la configurazione per utilizzare il linguaggio DSL. Per ricevere assistenza per questi aggiornamenti, utilizza AGP Upgrade Assistant (Strumenti > AGP Upgrade Assistant).

Per utilizzare le librerie native non compresse, rimuovi l'attributo android::extractNativeLibs dal manifest e aggiungi il seguente codice al file build.gradle.kts a livello di modulo (file build.gradle se utilizzi Groovy):

Kotlin

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

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

Flag di build sperimentali

Si tratta di flag sperimentali per la configurazione della build disponibili in AGP 8.1.

Segnala Aggiunto in Valore predefinito Note
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false Se attivi questa opzione senza specificare configurazioni di firma, AGP utilizza la configurazione di firma di debug predefinita quando esegui una build profilabile o sottoponibile a debug. Questo flag è disattivato per impostazione predefinita per incoraggiare gli autori delle build a dichiarare configurazioni di firma di profilazione specifiche.
android.experimental.library.desugarAndroidTest AGP 8.0 false Questo flag consente ai generatori di librerie di abilitare la rimozione dello zucchero sintattico della libreria principale per APK di test senza influire sull'AAR prodotto, ad esempio tramite linting. Abbiamo intenzione di supportare questo comportamento nell'API Variant.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false Se attivato, Gradle Managed Devices consente un tipo di dispositivo personalizzato definito dall'utente che può essere fornito da un plug-in. Questo flag deve essere abilitato se vuoi utilizzare il plug-in Firebase Test Lab.
android.lint.printStackTrace AGP 8.0 false Se abilitato, Android lint stampa una stacktrace in caso di arresto anomalo. Questo flag ha le stesse funzionalità della variabile di ambiente LINT_PRINT_STACKTRACE.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 Nessuno Specifica il numero massimo di Gradle Managed Devices (AVD) simultanei da attivare in un determinato momento. Se il valore è 0 o negativo, non esiste un numero massimo di dispositivi.
android.experimental.testOptions.installApkTimeout AGP 8.0 Nessuno La durata del timeout in secondi per installare un APK. Se il valore è 0 o negativo, verrà impostato su un valore predefinito da UTP.

Problemi risolti

Plug-in Android per Gradle 8.1.0

Problemi risolti
Plug-in Android per Gradle
Problemi di `com.android.build.gradle.tasks.ShaderCompile` con la cache di configurazione
L'aggiunta alle risorse Java utilizzando le API AGP interrompe la cache di configurazione
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so è incluso nel pacchetto APK
KGP legge il manifest durante la configurazione, invalidando la cache di configurazione in caso di modifica del manifest
Il messaggio di avviso non è chiaro quando si verifica un problema nel manifest unito
L'upgrade ad AGP 7.4 genera un errore StackOverflowError
ClassNotFoundException nella funzionalità dinamica che dipende direttamente dal sottoprogetto della libreria Kotlin
processDebugUnitTestManifest non riesce a elaborare i segnaposto del manifest per le varianti di test
processDebugUnitTestManifest non riesce a elaborare i segnaposto del manifest per le varianti di test
La proprietà dello spazio dei nomi probabilmente appartiene a HasAndroidResources
Impossibile disattivare il messaggio "I file Gradle sono stati modificati dall'ultima sincronizzazione del progetto"
"Ti consigliamo di utilizzare un plug-in Android Gradle più recente" quando non ne esiste uno più recente
processDebugUnitTestManifest non riesce a elaborare i segnaposto del manifest per le varianti di test
Flag booleano per disattivare il controllo dell'SDK di compilazione in CheckAarMetadataTask
L'errore di build si riferisce al livello API 34, che non esiste
L'impostazione della toolchain JVM non influisce sul valore di targetCompatibility di JavaCompile
Le voci deepLink di navigazione con domini con caratteri jolly non hanno un attributo `android:host` nel manifest unito
L'attività processDebugMainManifest non è riuscita a partire dal plug-in Android per Gradle 8.1
Possiamo rimuovere AnalyticsRecordingTask?
I contenuti di output-metadata.json non sono coerenti
Possiamo rimuovere AnalyticsRecordingTask?
I contenuti di output-metadata.json non sono coerenti
L'impostazione della toolchain JVM non influisce sul valore di targetCompatibility di JavaCompile
Le voci deepLink di navigazione con domini con caratteri jolly non hanno un attributo `android:host` nel manifest unito
L'attività processDebugMainManifest non è riuscita a partire dal plug-in Android per Gradle 8.1
Android Studio non rispetta la variabile di ambiente STUDIO_GRADLE_JDK
I tipi di origini personalizzate devono creare set di origini multiformato
DependenciesInfoBuilder richiede l'aggiornamento dell'API + documentazione
DexingNoClasspathTransform (minSdk >= 24) con Java 11 come target non riesce a causa della mancanza di membri nidificati
DslExtension.Builder.extendProjectWith() non funziona come descritto in Groovy
Aggiungi l'API VariantSelector.withFlavor che non utilizza kotlin.Pair
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) ha un errore di cache perché `proguard.txt` è stato modificato
Il file manifest unito dell'app contiene gli attributi extractNativeLibs e useEmbeddedDex delle dipendenze
AGP: Expose path to AIDL tool and framework AIDL file as public API
Richiesta: consenti all'IDE di offrire una correzione per "PermittedSubclasses richiede ASM9"
Bug: "Enable KSP and use the KSP processor for this dependency instead" (Attiva KSP e utilizza il processore KSP per questa dipendenza) rimanda a un sito web
Gradle 8.1 interrompe la memorizzazione nella cache della configurazione a causa di .gradle/.android/analytics.settings
generateLocaleConfig in AGP 8.1.0 utilizza un ordinamento non deterministico, interrompendo le build riproducibili
Dexer (D8)
L'eliminazione dello zucchero sintattico della libreria principale causa l'arresto anomalo dell'app dopo gli aggiornamenti recenti.
Regressione di AGP 8.1.0 con API 21 - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Pelucchi
Lint controlla solo i cast sicuri per le interfacce implementate direttamente, non per quelle ereditate
Lint non controlla i cast validi per i destinatari delle chiamate
TypedArray#close (API 31) non viene eseguito il desugaring, ma AS non mostra un avviso quando viene utilizzato in try-with-resources
Bug: avviso di falso positivo "Il provider "BC" è deprecato e a partire da Android P..."
Falso positivo di Lint su remember dopo l'upgrade di Kotlin alla versione 1.8.0
Avviso Lint di falso positivo per i controlli SDK_INT eseguiti all'interno di un metodo con un parametro enum
Il controllo lint TypographyQuotes non funziona con le virgolette di escape
Il controllo lint TrustAllX509TrustManager segnala erroneamente le interfacce che estendono X509TrustManager
Riformattazione solo del codice inserito di una correzione di sostituzione
Lint: l'anteprima dell'intent genera un'eccezione per ReplaceStringQuickFix
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
R8 su AGP 8 interrompe il servizio Google Fit
L'inclusione delle informazioni sul file di origine con nomi residui che si sovrappongono ai nomi di input non è rappresentata correttamente
R8 non riesce durante la build di Compose con ArrayIndexOutOfBoundsException
Il codice correlato a Simple StringBuilder non include la chiamata finale per l'aggiunta in modalità di rilascio o debuggable=false
Un caso limite nel metodo VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds()
dex-startup-optimization results in java.lang.VerifyError: Rejecting class
Arresto anomalo con errore di verifica su Android 12 e versioni successive

Plug-in Android per Gradle 8.1.1

Problemi risolti
Dexer (D8)
Java 16 Records: equals(null) genera NullPointerException
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
La build si blocca su :minifyReleaseWithR8 quando si utilizza la libreria Apache POI
Rifiuto della chiamata quando è abilitata l'ottimizzazione R8
NoClassDefFoundError per java.lang.reflect.Executable

Plug-in Android per Gradle 8.1.2

Problemi risolti
Plug-in Android per Gradle
androidResources non è disponibile nel modulo della libreria Android
[AGP 8.1.0] ./gradlew test non riesce con "Unable to find manifest output" se sia splits.abi.isEnable che testOptions.unitTests.isIncludeAndroidResources sono impostati su true
Shrinker (R8)
Kotlin 1.9 fa sì che le espressioni lambda Kotlin vengano eliminate da R8 se i controlli di nullità vengono rimossi
R8 non riesce a compilare play-services-measurement-21.3.0-runtime.jar e restituisce l'errore "Undefined value encountered during compilation" (Valore non definito rilevato durante la compilazione)

Plug-in Android per Gradle 8.1.3

Problemi risolti
Plug-in Android per Gradle
[AGP 8.1.0] ./gradlew test non riesce con "Unable to find manifest output" se sia splits.abi.isEnable che testOptions.unitTests.isIncludeAndroidResources sono impostati su true
Errore di build dopo l'aggiornamento ad AGP 8.1

Plug-in Android per Gradle 8.1.4

Problemi risolti
Plug-in Android per Gradle
Non eseguire l'attività di dexing sulle classi dei progetti secondari quando sono già state sottoposte a dexing tramite le trasformazioni degli artefatti