Plug-in Android per Gradle 8.0.0 (aprile 2023)

Il plug-in Android per Gradle 8.0.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 30.0.3 30.0.3 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.

Release delle patch

Di seguito è riportato un elenco delle release di patch per il plug-in Android per Gradle 8.0.

Plug-in Android per Gradle 8.0.2 (maggio 2023)

Per un elenco dei bug corretti in AGP 8.0.2, consulta Problemi chiusi di Android Studio 2022.2.1.

Plug-in Android per Gradle 8.0.1 (maggio 2023)

Questo aggiornamento secondario include le seguenti correzioni di bug:

Problemi risolti
Errore: "No VersionRequirement with the given id in the table" (Nessun VersionRequirement con l'ID specificato nella tabella) dopo l'upgrade di AGP 7.2.2 -> 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Errore di verifica della classe rigida su Android 11

Modifica che causa interruzione: spazio dei nomi obbligatorio nello script di build a livello di modulo

Devi impostare lo spazio dei nomi nel file build.gradle.kts a livello di modulo, anziché nel file manifest. Puoi iniziare a utilizzare la proprietà DSL namespace a partire da AGP 7.3. Per saperne di più, vedi Impostare uno spazio dei nomi.

Quando esegui la migrazione al DSL dello spazio dei nomi, tieni presente i seguenti problemi:

  • Le versioni precedenti di AGP deducono lo spazio dei nomi di test dallo spazio dei nomi principale o dall'ID applicazione, in modo errato in alcuni casi. L'assistente all'upgrade di AGP blocca l'upgrade se rileva che lo spazio dei nomi principale e lo spazio dei nomi di test del progetto sono uguali. Se l'upgrade è bloccato, devi modificare manualmente testNamespace e modificare il codice sorgente di conseguenza.
  • Dopo aver modificato lo spazio dei nomi di test, è possibile che la compilazione del codice vada a buon fine, ma che i test strumentati non vengano eseguiti in fase di runtime. Ciò può accadere se il codice sorgente del test strumentato fa riferimento a una risorsa definita sia nelle origini androidTest sia in quelle dell'app.

Per ulteriori informazioni, vedi il commento n. 19 del problema n. 191813691.

Modifiche che causano interruzioni: valori predefiniti delle opzioni di build

A partire da AGP 8.0, i valori predefiniti di questi flag sono stati modificati per migliorare il rendimento della build. Per ricevere assistenza per l'adeguamento del codice in modo da supportare alcune di queste modifiche, utilizza l'assistente per l'upgrade di AGP (Strumenti > Assistente per l'upgrade di AGP). L'assistente all'upgrade ti guida nell'aggiornamento del codice per adattarlo al nuovo comportamento o nell'impostazione dei flag per conservare il comportamento precedente.

Segnala Nuovo valore predefinito Valore predefinito precedente Note
android.defaults.buildfeatures.buildconfig false true AGP 8.0 non genera BuildConfig per impostazione predefinita. Devi specificare questa opzione utilizzando il linguaggio specifico del dominio nei progetti in cui è necessaria.
android.defaults.buildfeatures.aidl false true AGP 8.0 non attiva il supporto AIDL per impostazione predefinita. Devi specificare questa opzione utilizzando il linguaggio specifico del dominio nei progetti in cui ti serve. È prevista la rimozione di questo flag in AGP 9.0.
android.defaults.buildfeatures.renderscript false true AGP 8.0 non attiva il supporto di RenderScript per impostazione predefinita. Devi specificare questa opzione utilizzando il linguaggio specifico del dominio nei progetti in cui è necessaria. Questo flag verrà rimosso in AGP 9.0.
android.nonFinalResIds true false AGP 8.0 genera classi R con campi non finali per impostazione predefinita.
android.nonTransitiveRClass true false AGP 8.0 genera classi R solo per le risorse definite nel modulo corrente.
android.enableR8.fullMode true false AGP 8.0 abilita la modalità completa R8 per impostazione predefinita. Per maggiori dettagli, vedi Modalità completa R8.

Modifiche che causano interruzioni: valori delle opzioni di build applicati

A partire da AGP 8.0, non puoi più modificare i valori di questi flag. Se li specifichi nel file gradle.properties, il valore viene ignorato e AGP stampa avvisi.

Segnala Valore applicato Note
android.dependencyResolutionAtConfigurationTime.warn true AGP 8.0 genera un avviso se rileva la risoluzione della configurazione durante la fase di configurazione, perché influisce negativamente sui tempi di configurazione di Gradle.
android.r8.failOnMissingClasses true AGP 8.0 non riesce a creare build che utilizzano R8 se mancano classi per garantire una migliore ottimizzazione DEX. Per risolvere il problema, devi aggiungere le librerie mancanti o le regole di conservazione -dontwarn. Per maggiori dettagli, vedi Avvisi relativi alle classi mancanti nel riduttore R8.
android.testConfig.useRelativePath true Quando è attivato il supporto per l'utilizzo di risorse, asset e manifest Android nei test delle unità, AGP 8.0 genera un file test_config.properties che contiene solo percorsi relativi. In questo modo, i test delle unità Android possono sempre utilizzare la cache di build di Gradle.
android.useNewJarCreator true AGP utilizza la libreria Zipflinger durante la creazione di file JAR per migliorare le prestazioni di build.
android.bundletool.includeRepositoriesInDependencyReport true Quando l'aggiunta delle informazioni sulle dipendenze SDK in AAB e APK è abilitata, AGP 8.0 aggiunge anche un elenco di repository del progetto a queste informazioni. Per scoprire di più, consulta Informazioni sulle dipendenze per Play Console.
android.enableArtProfiles true Ora i profili di base vengono sempre generati. Per i dettagli, consulta Profili di base.
android.enableNewResourceShrinker true Utilizza la nuova implementazione di riduzione delle risorse per impostazione predefinita. Il nuovo riduttore di risorse include il supporto per le funzionalità dinamiche.
android.enableSourceSetPathsMap true Utilizzato per calcolare le mappature dei percorsi delle risorse relative, in modo che le build Gradle siano aggiornate più spesso.
android.cacheCompileLibResources true Ora le risorse della libreria compilate possono essere memorizzate nella cache per impostazione predefinita perché Gradle monitora i file delle risorse rispetto alla posizione del progetto. Richiede l'attivazione di android.enableSourceSetPathsMap.
android.disableAutomaticComponentCreation true AGP 8.0 non crea SoftwareComponent per impostazione predefinita. AGP crea invece SoftwareComponent solo per le varianti configurate per la pubblicazione utilizzando il DSL di pubblicazione.

Nuovo flag stabile per il profilo di esecuzione

AGP include il nuovo flag android.settings.executionProfile. Utilizza questo flag per ignorare il profilo di esecuzione predefinito di SettingsExtension. Per saperne di più, consulta la documentazione del plug-in delle impostazioni.

Per visualizzare l'anteprima dei flag sperimentali, consulta le note di rilascio dell'anteprima.

Assegnazione di proprietà Kotlin lazy non supportata

Se utilizzi Kotlin DSL di Gradle per gli script di build, tieni presente che Android Studio e AGP 8.0 non supportano l'assegnazione sperimentale di proprietà utilizzando l'operatore =. Per saperne di più su questa funzionalità, consulta le note di rilascio e la documentazione.

Categorie di attività di Build Analyzer

A partire da Android Studio Flamingo, Build Analyzer ha una nuova visualizzazione predefinita per le attività che influiscono sulla durata della build. Se il tuo progetto utilizza AGP 8.0 o versioni successive, anziché visualizzare le attività singolarmente, Build Analyzer le raggruppa per categoria. Ad esempio, le attività specifiche per le risorse Android, Kotlin o Dexing sono raggruppate e poi ordinate in base alla durata della build. In questo modo è facile sapere quale categoria ha il maggiore impatto sul tempo di compilazione. Se espandi ogni categoria, viene visualizzato un elenco delle attività corrispondenti. Per visualizzare le attività singolarmente, senza raggrupparle, utilizza il menu a discesa Raggruppa per.

Categorie di attività di Build Analyzer.

Nuovo plug-in delle impostazioni

AGP 8.0.0-alpha09 introduce il nuovo plug-in delle impostazioni. Il plug-in delle impostazioni ti consente di centralizzare le configurazioni globali, ovvero quelle che si applicano a tutti i moduli, in un unico posto, in modo da non dover copiare e incollare le configurazioni in più moduli. Inoltre, puoi utilizzare il plug-in delle impostazioni per creare profili di esecuzione degli strumenti o istruzioni diverse per l'esecuzione di uno strumento e passare da uno all'altro.

Per utilizzare il plug-in delle impostazioni, applicalo nel file settings.gradle:

apply plugin 'com.android.settings'

Centralizzare le configurazioni globali

Per configurare le configurazioni globali, utilizza il nuovo blocco android nel file settings.gradle. Ecco un esempio:

android {
  compileSdk 31
  minSdk 28
  ...
}

Profili di esecuzione degli strumenti

Il plug-in delle impostazioni consente anche di creare profili di esecuzione per alcuni strumenti. Un profilo di esecuzione determina la modalità di esecuzione di uno strumento. Puoi selezionare profili di esecuzione diversi a seconda dell'ambiente. In un profilo di esecuzione, puoi impostare gli argomenti JVM per uno strumento e configurarlo per l'esecuzione in un processo separato. Al momento è supportato solo lo strumento R8.

Crea profili di esecuzione e imposta il profilo di esecuzione predefinito nel file settings.gradle, come mostrato nell'esempio seguente:

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"
  }
}

Per ignorare il profilo predefinito, seleziona un profilo diverso utilizzando la proprietà android.experimental.settings.executionProfile nel file gradle.properties:

android.experimental.settings.executionProfile=high

Puoi impostare questa proprietà anche utilizzando la riga di comando, che ti consente di configurare diversi flussi di lavoro. Ad esempio, se hai un flusso di lavoro di integrazione continua, puoi utilizzare la riga di comando per modificare il profilo di esecuzione senza dover modificare il file settings.gradle:

./gradlew assembleRelease \
  -Pandroid.experimental.settings.executionProfile=ci

Per eseguire AGP 8.0 è richiesto JDK 17

Quando utilizzi il plug-in Android per Gradle 8.0 per creare la tua app, ora è necessario JDK 17 per eseguire Gradle. Android Studio Flamingo include JDK 17 e configura Gradle per utilizzarlo per impostazione predefinita, il che significa che la maggior parte degli utenti di Android Studio non deve apportare modifiche alla configurazione dei propri progetti.

Se devi impostare manualmente la versione di JDK utilizzata da AGP in Android Studio, devi utilizzare JDK 17 o versioni successive.

Quando utilizzi AGP indipendentemente da Android Studio, esegui l'upgrade della versione JDK impostando la JAVA_HOME variabile di ambiente o l'-Dorg.gradle.java.home opzione della riga di comando alla directory di installazione di JDK 17.

Problemi risolti

Plug-in Android per Gradle 8.0.0

Problemi risolti
Plug-in Android per Gradle
Errore di compilazione irregolare nell'attività MergeResources
JavaPluginConvention e HasConvention sono deprecati
Posizione del file errata e incoerente per la nuova API di trasformazione
Il plug-in Android per Gradle non deve utilizzare la funzione GUtil.toWords(string) deprecata
Il plug-in Android Gradle non deve utilizzare la funzione ConfigureUtil.configure(closure, target) deprecata
Aggiorna i test AGP per utilizzare KGP 1.7.20-Beta
Gradle 7.4 non riesce (impossibile creare l'istanza di AnalyticsService)
Nuova "costante enum sconosciuta" da javac su AGP 7.4.0-alpha09
La configurazione di MergeGeneratedProguardFilesCreationAction è lenta anche con la memorizzazione nella cache della configurazione attiva
[AGP] Add generated source directory to IDE model (Variant API)
JavaPluginConvention e HasConvention sono deprecati
Non aggiungere ignorewarnings a R8 per impostazione predefinita
Avvisa quando i file Proguard non esistono
AGP 7.3.0 interrompe la sincronizzazione Gradle per i progetti della piattaforma Gradle
libreria apksig: ApkVerifier$Result.getV4SchemeSigners() è contrassegnato come privato
Interrompi la creazione della configurazione androidJacocoAnt se la copertura non è abilitata
L'utilizzo di @IntDef in un componente della libreria non genera annotations.zip nel file AAR
Impossibile trovare un supertipo comune per e
Aggiungi una versione della proprietà Gradle di LINT_PRINT_STACKTRACE=true
Artefatti prefabbricati obsoleti inclusi nel pacchetto AAR
Esegui la migrazione dalla proprietà destination a outputLocation per risolvere l'avviso di ritiro e prepararti per Gradle 9.0
Tieni conto del flag `--release` durante la configurazione dell'attività JavaCompile
[AGP-7.3.0-beta03] ShrinkResourcesNewShrinkerTask non riesce quando c'è una riga vuota dopo la dichiarazione XML
lintVital target run by default in a debug variant
Avvisa quando i file Proguard non esistono
AGP tenta di aggiungere kotlinOptions.freeCompilerArgs nella fase di esecuzione dell'attività
Sincronizzazione Gradle non riuscita: sincronizzazione non riuscita: motivo sconosciuto
DependencyReportTask non è compatibile con la cache di configurazione
L'override delle risorse con resValue in build.gradle genera l'errore: Duplicate resources
Il tipo di build "debug" ha una chiave di firma predefinita, gli altri no
L'utilizzo di funzionalità dinamiche e della riduzione delle risorse causa un arresto anomalo del runtime
Il tipo di build "debug" ha una chiave di firma predefinita, gli altri no
directory di origine generata elencata come directory Java nel provider di origine principale del modello lint
Gradle 8.0-milestone-2 causa un'eccezione in AGP
Ottimizzare l'unione dei manifest per app e librerie
Aggiungi gradle-settings-api alla generazione di Javadoc
Nuova "costante enum sconosciuta" da javac su AGP 7.4.0-alpha09
AGP 7.4.0-alpha09 genera build che non vengono caricate in Firebase App Distribution
lint.xml nei moduli non viene preso in considerazione per il controllo UP-TO-DATE delle attività lint
Plug-in Android per Gradle 7.0+ e problema dei test Android: impossibile trovare la risorsa: id
configureCMakeDebug si arresta in modo instabile con eccezione di puntatore nullo
IllegalAccessError durante l'upgrade del progetto ad AS2022.2.1.5, FireBasePerfPlugin
La sincronizzazione non riesce e viene visualizzato l'errore criptico "La raccolta non contiene alcun elemento corrispondente al predicato".
L'API Instrumentation non trasforma le dipendenze dei file locali
Errore "Vengono eseguite query su AnnotationProcessorOptions.arguments" durante l'aggiornamento alla versione 7.4 Beta 1
Sposta i plug-in pubblici di Gradle in gradle-api e rimuovi BasePlugin.getExtension
r8.jvmArgs non vengono utilizzati
JDK17 come versione minima richiesta per AGP
AGP 8.0.0 A8 interrompe i profili di base
Modifica "compileSdkVersion" in "compileSdk" nel messaggio CheckAarMetadataTask in AGP 8.0
AGP 7.4.0-rc01 interrompe l'API Variant con "Querying the mapped value of map(provider(java.util.Set)) before task '...' has completed is not supported"
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
Il plug-in Lint non fa parte di gradle-api
DexingFileDependenciesTask.outputKeepRules è una directory, ma è contrassegnata come OutputFile
L'upgrade ad AGP 7.4 genera un errore StackOverflowError
processDebugUnitTestManifest non riesce a elaborare i segnaposto del manifest per le varianti di test
Lint accede alle informazioni sui set di origine senza dipendenze
L'errore di build si riferisce al livello API 34, che non esiste
"Ti consigliamo di utilizzare un plug-in Android Gradle più recente" quando non ne esiste uno più recente
android.injected.testOnly=false non funziona
Dexer (D8)
Errore di unione Dex relativo ai sintetici globali dopo l'upgrade di AS Canary 6 a 7
Aggiorna la libreria dei metadati Kotlin alla versione 0.6.0
La soluzione alternativa per JDK-8272564 sembra essere necessaria per i livelli API 28-30
Pelucchi
Il controllo lint ResourceType non funziona per le origini Kotlin
VersionChecks non gestisce i controlli dell'intervallo Kotlin
Falso positivo per InlinedApi quando è incluso
Lint false positive Recycle regarding openInputStream
[BuildTool/Lint] ChecksSdkIntAtLeast constructor property
Lint: PartialResults merging works incorrectly
Android Studio contrassegna erroneamente la versione specificata come obsoleta.
AndroidDeprecationInspection.DeprecationFilter EP non è mai registrato nel file android-plugin.xml
La spiegazione del controllo lint AccessibilityDetector è obsoleta
I controlli Lint SDK_INT devono comprendere le variabili locali temporanee
Errore quando TestMode.TYPE_ALIAS sostituisce il tipo di funzione con typealias
Bug: quando ObjectAnimator viene creato al di fuori del blocco di codice corrente, vengono visualizzati avvisi di falsi positivi che indicano che non è stato avviato #38
Lint: NPE due to querying Application instance in mergeOnly mode
La regola lint NonConstantResourceId non è in grado di rilevare l'assegnazione di valori costanti dall'ID risorsa
non mostra l'errore nell'ID vista
La mancata deserializzazione della cache delle risorse di lint genera un errore di lint (ma dovrebbe essere un avviso)
AGP Flamingo Alpha 8 Lint NewApi Desugar Regression
TypedArray#close (API 31) non viene eseguito il desugaring, ma AS non mostra un avviso quando viene utilizzato in try-with-resources
Lint non controlla i cast validi per i destinatari delle chiamate
Lint controlla solo i cast sicuri per le interfacce implementate direttamente, non per quelle ereditate
Integrazione di Lint
Il file di base è attualmente un input e un output delle attività Lint
Shrinker (R8)
Errore NPE / di asserzione nel verificatore del frame CF
Regressione dopo la rimozione della cache di ricerca dei campi
`:app:minifyVariantWithR8` genera un'eccezione NullPointerException in AGP 7.4.0-beta02
R8: ClassNotFoundException quando -allowaccessmodification
Aggiungere il supporto per i ricevitori di contesto nei metadati
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
Riduzione del codice Renderscript: calo significativo delle prestazioni durante l'upgrade di AGP dalla versione 7.3.1 alla 7.4.0

Plug-in Android per Gradle 8.0.1

Problemi risolti
Shrinker (R8)
Errore: "No VersionRequirement with the given id in the table" (Nessun VersionRequirement con l'ID specificato nella tabella) dopo l'upgrade di AGP 7.2.2 -> 7.4.0
R8 NullPointerException at markTypeAsLive AGP 7.4.1
[R8 4.0.53] Errore di verifica della classe rigida su Android 11

Plug-in Android per Gradle 8.0.2

Problemi risolti
Shrinker (R8)
R8 non riesce durante la build di Compose con ArrayIndexOutOfBoundsException
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