Plug-in Android per Gradle 8.0.0 (aprile 2023)

Il plug-in Android per Gradle 8.0.0 è una release importante 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 compilazione dell'SDK.
NDK N/D 25.1.8937393 Installa o configura una versione diversa del NDK.
JDK 17 17 Per saperne di più, vedi Impostare la versione 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 Android Studio 2022.2.1 closed issues.

Plug-in Android per Gradle 8.0.1 (maggio 2023)

Questo aggiornamento minore include le seguenti correzioni di bug:

Problemi risolti
Errore: "Nessun VersionRequirement con l'ID specificato nella tabella" dopo l'upgrade di AGP 7.2.2 -> 7.4.0
R8 NullPointerException in markTypeAsLive AGP 7.4.1
[R8 4.0.53] Errore di verifica della classe difficile su Android 11

Modifica incompatibile: spazio dei nomi obbligatorio nello script di compilazione 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ù, consulta 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 erroneamente lo spazio dei nomi del test dallo spazio dei nomi principale o dall'ID applicazione in alcuni casi. L'Assistente all'upgrade di AGP blocca l'upgrade se rileva che lo spazio dei nomi principale e quello di test del progetto sono uguali. Se l'upgrade è bloccato, devi modificare manualmente testNamespace e modificare di conseguenza il codice sorgente.
  • Dopo aver modificato lo spazio dei nomi del test, è possibile che il codice venga compilato, ma i test con strumenti non vadano a buon fine in fase di esecuzione. Ciò può accadere se il codice sorgente del test instrumentato fa riferimento a una risorsa definita sia nelle origini androidTest sia nelle origini dell'app.

Per ulteriori informazioni, consulta issue #191813691 comment #19.

Modifiche non compatibili: valori predefiniti dell'opzione di compilazione

A partire da AGP 8.0, i valori predefiniti di questi flag sono stati modificati per migliorare il rendimento della compilazione. Per ricevere assistenza per modificare il codice in modo da supportare alcune di queste modifiche, utilizza l'Assistente all'upgrade di AGP (Strumenti > Assistente all'upgrade di AGP). L'Assistente all'upgrade ti guida nell'aggiornamento del codice per adattarlo al nuovo comportamento o nell'impostazione di flag per preservare 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 DSL nei progetti in cui ti serve.
android.defaults.buildfeatures.aidl false true AGP 8.0 non abilita il supporto di AIDL per impostazione predefinita. Devi specificare questa opzione utilizzando il DSL 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 DSL nei progetti in cui ti serve. È prevista la rimozione di questo flag 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 per le risorse definite solo nel modulo corrente.
android.enableR8.fullMode true false AGP 8.0 attiva la modalità completa R8 per impostazione predefinita. Per maggiori dettagli, consulta Modalità completa R8.

Modifiche non compatibili: valori delle opzioni di compilazione forzate

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 emette 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 compilare le build che utilizzano R8 se mancano classi per garantire una migliore ottimizzazione DEX. Per risolvere il problema, devi aggiungere le raccolte mancanti o le regole di mantenimento -dontwarn. Per maggiori dettagli, consulta Avvisi mancanti sulla classe nello shrinker R8.
android.testConfig.useRelativePath true Quando è abilitato il supporto per l'utilizzo di risorse, asset e manifest di Android nei test di unità, AGP 8.0 genera un file test_config.properties contenente solo percorsi relativi. In questo modo, i test delle unità Android possono sempre utilizzare la cache di compilazione di Gradle.
android.useNewJarCreator true AGP utilizza la libreria Zipflinger per creare file JAR al fine di migliorare il rendimento della compilazione.
android.bundletool.includeRepositoriesInDependencyReport true Quando l'aggiunta delle informazioni sulle dipendenze SDK in AAB e APK è attivata, AGP 8.0 aggiunge a queste informazioni anche un elenco di repository del progetto. Per approfondire, consulta Informazioni sulle dipendenze per Play Console.
android.enableArtProfiles true Ora i profili di riferimento vengono sempre generati. Per informazioni dettagliate, consulta Profili di riferimento.
android.enableNewResourceShrinker true Utilizza la nuova implementazione di risorse più piccole per impostazione predefinita. Il nuovo ridimensionatore delle risorse include il supporto delle funzionalità dinamiche.
android.enableSourceSetPathsMap true Viene utilizzato per calcolare le mappature dei percorsi delle risorse relative, in modo che le compilazioni di 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 SoftwareComponents 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 eseguire l'override del profilo di esecuzione predefinito da SettingsExtension. Per scoprire di più, consulta la documentazione del plug-in delle impostazioni.

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

L'assegnazione della proprietà lazy di Kotlin non è supportata

Se utilizzi il DSL Kotlin di Gradle per gli script di compilazione, tieni presente che Android Studio e AGP 8.0 non supportano l'assegnazione sperimentale delle proprietà tramite 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 compilazione. Se il tuo progetto utilizza AGP 8.0 o versioni successive, invece di visualizzare le attività singolarmente, Build Analyzer le raggruppa per categoria. Ad esempio, le attività specifiche per le risorse Android, Kotlin o il dexing vengono raggruppate e poi ordinate in base alla durata della compilazione. In questo modo è facile sapere quale categoria ha l'impatto maggiore sui tempi di compilazione. L'espansione di ogni categoria consente di visualizzare 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 di impostazioni

AGP 8.0.0-alpha09 introduce il nuovo plug-in delle impostazioni. Il plug-in delle impostazioni consente di centralizzare le configurazioni globali, ovvero quelle che si applicano a tutti i moduli, in un unico posto in modo da non doverle copiare e incollare in più moduli. Inoltre, puoi utilizzare il plug-in delle impostazioni per creare profili di esecuzione degli strumenti o istruzioni diverse su come eseguire 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 settings.gradle file. Ecco un esempio:

android {
  compileSdk 31
  minSdk 28
  ...
}

Profili di esecuzione dello strumento

Il plug-in delle impostazioni ti consente anche di creare profili di esecuzione per alcuni strumenti. Un profilo di esecuzione determina in che modo viene eseguito uno strumento. Puoi selezionare diversi profili di esecuzione 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 i profili di esecuzione e imposta quello predefinito nel settings.gradle file, 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 sostituire il profilo predefinito, selezionane un altro 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, il 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

JDK 17 necessario per eseguire AGP 8.0

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

Se devi impostare manualmente la versione 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 a riga di comando nella 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 non affidabile nell'attività MergeResources
JavaPluginConvention e HasConvention sono deprecati
Posizione del file errata e incoerente per la nuova API di trasformazione
Il plug-in Android Gradle non deve utilizzare la funzione deprecata GUtil.toWords(string)
Il plug-in Gradle per Android non deve utilizzare la funzione deprecata ConfigureUtil.configure(closure, target)
Aggiorna i test AGP per utilizzare KGP 1.7.20-Beta
Gradle 7.4 non va a buon fine (impossibile creare un'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 attivata
[AGP] Aggiungere la directory di origine generata al modello IDE (API Variant)
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 di 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 è attivata
L'utilizzo di @IntDef in un componente della libreria non genera annotations.zip nell'aar
Impossibile trovare il supertipo comune per e
Aggiungi una versione della proprietà gradle di LINT_PRINT_STACKTRACE=true
Artefatti prefab obsoleti pacchettizzati in AAR
Esegui la migrazione dalla proprietà destinazione alla proprietà outputLocation per risolvere l'avviso di ritiro e prepararti a Gradle 9.0
Tieni conto del flag `--release` quando configuri l'attività JavaCompile
[AGP-7.3.0-beta03] ShrinkResourcesNewShrinkerTask non riesce se dopo la dichiarazione XML è presente una riga vuota
Il target lintVital viene eseguito per impostazione predefinita in una variante di debug
Avvisa quando i file ProGuard non esistono
AGP tenta di aggiungere kotlinOptions.freeCompilerArgs nella fase di esecuzione dell'attività
Gradle sync failed: Sync failed: reason unknown
DependencyReportTask non è compatibile con la cache di configurazione
La sostituzione delle risorse con resValue in build.gradle genera l'errore: Risorse duplicate
Il tipo di build "debug" ha una chiave di firma predefinita, mentre gli altri no
L'utilizzo di funzionalità dinamiche e riduzione delle risorse causa un arresto anomalo del runtime
Il tipo di build "debug" ha una chiave di firma predefinita, mentre gli altri no
directory di origine generata elencata come directory Java nel provider di origine principale del modello di lint
Gradle 8.0-milestone-2 causa un'eccezione in AGP
Ottimizzare l'unione del file manifest per le app e la libreria
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
Il file lint.xml nei moduli non viene considerato per il controllo AGGIORNATO delle attività di lint
Problema con il plug-in Android per Gradle 7.0 e versioni successive e i test Android: impossibile trovare la risorsa: id
Arresto anomalo di configureCMakeDebug con eccezione di puntatore nullo
IllegalAccessError durante l'upgrade del progetto ad AS2022.2.1.5, FireBasePerfPlugin
La sincronizzazione non riesce con l'errore criptico "La raccolta non contiene elementi corrispondenti al predicato".
L'API Instrumentation non trasforma le dipendenze dei file locali
Errore "AnnotationProcessorOptions.arguments are queried" 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 viene utilizzato
JDK17 come versione minima richiesta per AGP
AGP 8.0.0 A8 rompe i profili di riferimento
Cambia "compileSdkVersion" in "compileSdk" nel messaggio CheckAarMetadataTask in AGP 8.0
AGP 7.4.0-rc01 interrompe l'API Variant con "La query sul valore mappato di map(provider(java.util.Set)) prima del completamento dell'attività '...' non è supportata"
Problemi di `com.android.build.gradle.tasks.ShaderCompile` con la cache di configurazione
L'aggiunta di 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 con i segnaposto del manifest per le varianti di test
Lint accede alle informazioni degli insiemi di origine senza dipendenze
L'errore di compilazione si riferisce al livello API 34, che non esiste
"Ti consigliamo di utilizzare un plug-in Gradle per Android più recente" quando non è disponibile una versione più recente
android.injected.testOnly=false non funziona
Dexer (D8)
Errore di unione di Dex relativo ai dati sintetici globali dopo l'upgrade di AS Canary 6 a 7
Aggiorna la libreria di metadati Kotlin alla versione 0.6.0
Sembra che la soluzione alternativa per JDK-8272564 sia necessaria per i livelli API 28-30
Lint
Il controllo lint ResourceType non funziona per le origini Kotlin
VersionChecks non gestisce i controlli di intervallo di Kotlin
Falso positivo per InlinedApi quando è incapsulato
Riciclo di falsi positivi di Lint relativo a openInputStream
[BuildTool/Lint] Proprietà del costruttore ChecksSdkIntAtLeast
Lint: l'unione di PartialResults non funziona correttamente
Android Studio contrassegna erroneamente la versione specificata come non aggiornata.
L'EP AndroidDeprecationInspection.DeprecationFilter non viene mai registrato nel file android-plugin.xml
La spiegazione del controllo lint di 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 relativi alla mancata attivazione #38
Lint: NPE dovuto alla query dell'istanza dell'applicazione in modalità mergeOnly
La regola di lint NonConstantResourceId non riesce a rilevare l'assegnazione di valori costanti dall'ID risorsa
not showing error on view id
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 è stato desugared, ma AS non mostra l'avviso se utilizzato in try-with-resources
Lint non controlla le trasmissioni valide per i destinatari delle chiamate
Lint controlla i trasferimenti sicuri solo per le interfacce implementate direttamente, non per quelle ereditate
Integrazione di lint
Il file di riferimento è attualmente un input e un output delle attività di lint
Shrinker (R8)
NPE / errore di asserzione nel verificatore del frame CF
Regressione dopo la rimozione della cache di ricerca dei campi
`:app:minifyVariantWithR8` genera un'eccezione NullPointer in AGP 7.4.0-beta02
R8: ClassNotFoundException quando è impostato il flag -allowaccessmodification
Aggiunta del supporto per i destinatari 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 - Tentativo di mettere in coda un'azione in un elenco di lavoro dell'accodatore non inoltrabile
Minificazione del codice Renderscript: calo enorme 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: "Nessun VersionRequirement con l'ID specificato nella tabella" dopo l'upgrade di AGP 7.2.2 -> 7.4.0
R8 NullPointerException in markTypeAsLive AGP 7.4.1
[R8 4.0.53] Errore di verifica della classe difficile su Android 11

Plug-in Android per Gradle 8.0.2

Problemi risolti
Shrinker (R8)
R8 non riesce a compilare Compose con ArrayIndexOutOfBoundsException
VerifyError: il verificatore ha rifiutato la classe quando si utilizza R8 con Kotlin 1.8.20
R8 su AGP 8 interrompe il servizio Google Fit
Le informazioni del file di origine con nomi residui che si sovrappongono ai nomi di input non sono rappresentate correttamente