Plug-in Android per Gradle 3.6.0 (febbraio 2020)
Questa versione del plug-in Android richiede quanto segue:
Versione minima | Versione predefinita | Note | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | Per scoprire di più, consulta la sezione Aggiornare Gradle. |
Strumenti di compilazione SDK | 28.0.3 | 28.0.3 | Installa o configura gli strumenti di compilazione dell'SDK. |
Questo aggiornamento minore supporta la compatibilità con le nuove impostazioni e funzionalità predefinite per la visibilità del pacchetto in Android 11.
Per informazioni dettagliate, consulta le note di rilascio della versione 4.0.1.
Nuove funzionalità
Questa versione del plug-in Android per Gradle include le seguenti nuove funzionalità.
Visualizza associazione
Il binding delle visualizzazioni garantisce la sicurezza in fase di compilazione quando fai riferimento alle visualizzazioni nel
tuo codice. Ora puoi sostituire findViewById()
con il
riferimento alla classe di binding generato automaticamente. Per iniziare a utilizzare il binding delle visualizzazioni,
includi quanto segue nel file build.gradle
di ogni modulo:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
Per scoprire di più, leggi la documentazione relativa al binding della visualizzazione.
Supporto per il plug-in Maven Publish
Il plug-in Android per Gradle include il supporto per il plug-in Maven per la pubblicazione di Gradle, che consente di pubblicare gli artefatti di compilazione in un repository Apache Maven. Il plug-in Gradle per Android crea un componente per ogni artefatto della variante di build nel modulo della tua app o libreria che puoi utilizzare per personalizzare una pubblicazione in un repository Maven.
Per saperne di più, vai alla pagina su come utilizzare il plug-in Maven Publish.
Nuovo strumento di pacchettizzazione predefinito
Quando viene compilata la versione di debug dell'app, il plug-in utilizza un nuovo
strumento di packaging, chiamato zipflinger, per compilare l'APK. Questo nuovo
strumento dovrebbe offrire miglioramenti alla velocità di compilazione. Se il nuovo strumento di pacchetti
non funziona come previsto,
segnala un bug. Puoi tornare
a utilizzare lo strumento di imballaggio precedente includendo quanto segue nel
file gradle.properties
:
android.useNewApkCreator=false
Attribuzione della build nativa
Ora puoi determinare il tempo necessario a Clang per compilare e collegare ogni file C/C++ nel progetto. Gradle può generare una traccia di Chrome contenente i timestamp di questi eventi del compilatore, in modo da comprendere meglio il tempo necessario per compilare il progetto. Per generare questo file di attribuzione della compilazione:
-
Aggiungi il flag
-Pandroid.enableProfileJson=true
quando esegui una compilazione Gradle. Ad esempio:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Apri il browser Chrome e digita
chrome://tracing
nella barra di ricerca. -
Fai clic sul pulsante Carica e vai a
<var>project-root</var>/build/android-profile
per trovare il file. Il file si chiamaprofile-<var>timestamp</var>.json.gz
.
Puoi visualizzare i dati di attribuzione della compilazione nativa nella parte superiore del visualizzatore:
Modifiche al comportamento
Quando utilizzi questa versione del plug-in, potresti riscontrare le seguenti modifiche di comportamento.
Librerie native pacchettizzate non compresse per impostazione predefinita
Quando crei l'app, il plug-in ora imposta
extractNativeLibs
su "false"
per
impostazione predefinita. In altre parole, le librerie native sono allineate alle pagine e pacchettizzate
non compresse. Sebbene questo comporti un aumento delle dimensioni del caricamento, gli utenti beneficiano di quanto segue:
- Dimensioni di installazione dell'app ridotte perché la piattaforma può accedere alle librerie native direttamente dall'APK installato, senza creare una copia delle librerie.
- Dimensioni di download ridotte perché la compressione del Play Store è in genere migliore se includi librerie native non compresse nell'APK o nell'Android App Bundle.
Se vuoi che il plug-in Android per Gradle pacchettizzi le librerie native compresse, includi quanto segue nel file manifest dell'app:
<application
android:extractNativeLibs="true"
... >
</application>
Nota: l'attributo extractNativeLibs
manifest
è stato sostituito dall'opzione useLegacyPackaging
DSL. Per ulteriori informazioni, consulta la nota di rilascio Utilizzare il DSL per pacchettizzare le librerie native compresse.
Versione NDK predefinita
Se scarichi più versioni dell'NDK, il plug-in Gradle per Android ora seleziona una versione predefinita da utilizzare per la compilazione dei file di codice sorgente.
In precedenza, il plug-in selezionava la versione più recente scaricata dell'NDK.
Utilizza la proprietà android.ndkVersion
nel file build.gradle
del modulo per sostituire il valore predefinito selezionato dal plug-in.
Generazione semplificata di classi R
Il plug-in Gradle per Android semplifica il percorso di compilazione generando un solo classe R per ogni modulo della libreria nel progetto e condividendo queste classi R con le altre dipendenze del modulo. Questa ottimizzazione dovrebbe comportare compilazioni più rapide, ma richiede di tenere presente quanto segue:
- Poiché il compilatore condivide le classi R con le dipendenze dei moduli di upstream, è importante che ogni modulo del progetto utilizzi un nome di pacchetto univoco.
- La visibilità della classe R di una libreria per le altre dipendenze del progetto
è determinata dalla configurazione utilizzata per includere la libreria come
una dipendenza. Ad esempio, se la libreria A include la libreria B come dipendenza "api", la libreria A e le altre librerie che dipendono dalla libreria A hanno accesso alla classe R della libreria B. Tuttavia, altre biblioteche potrebbero non avere accesso al corso R della Biblioteca B. Se la libreria A utilizza la configurazione della dipendenza
implementation
. Per saperne di più, consulta la sezione sulle configurazioni delle dipendenze.
Rimuovi le risorse mancanti dalla configurazione predefinita
Per i moduli della libreria, se includi una risorsa per una lingua che non includi nell'insieme predefinito di risorse, ad esempio se includi hello_world
come risorsa stringa in /values-es/strings.xml
, ma non la definisci in /values/strings.xml
, il plug-in Android Gradle non la include più durante la compilazione del progetto. Questa modifica del comportamento dovrebbe comportare un numero minore di Resource Not Found
eccezioni di runtime e una maggiore velocità di compilazione.
D8 ora rispetta le norme di conservazione di CLASS per le annotazioni
Durante la compilazione dell'app, D8 ora rispetta quando le annotazioni applicano un criterio di conservazione CLASS e queste annotazioni non sono più disponibili al momento dell'esecuzione. Questo comportamento si verifica anche quando l'SDK target dell'app è impostato su il livello API 23, che in precedenza consentiva l'accesso a queste annotazioni durante il runtime durante la compilazione dell'app utilizzando versioni precedenti del plug-in Android Gradle e D8.
Altre modifiche al comportamento
-
aaptOptions.noCompress
non è più sensibile alle maiuscole su tutte le piattaforme (sia per APK che per bundle) e rispetta i percorsi che utilizzano caratteri maiuscoli. -
Il binding dei dati è ora incrementale per impostazione predefinita. Per scoprire di più, consulta il problema 110061530.
-
Tutti i test di unità, inclusi i test di unità Roboelectric, ora sono completamente memorizzabili nella cache. Per scoprire di più, consulta il problema 115873047.
Correzioni di bug
Questa versione del plug-in Android per Gradle include le seguenti correzioni di bug:
- I test di unità Robolectric ora sono supportati nei moduli della libreria che utilizzano l'associazione di dati. Per scoprire di più, consulta issue #126775542.
- Ora puoi eseguire attività
connectedAndroidTest
su più moduli quando la modalità di esecuzione in parallelo di Gradle è attivata.
Problemi noti
Questa sezione descrive i problemi noti del plug-in Android per Gradle 3.6.0.
Prestazioni lente dell'attività Android Lint
Il completamento di Android Lint può richiedere molto più tempo in alcuni progetti a causa di una regressione nell'infrastruttura di analisi, con un conseguente calcolo più lento dei tipi dedotti per le lambda in determinati costrutti di codice.
Il problema è segnalato come un bug in IDEA e verrà risolto nel plug-in Android per Gradle 4.0.
Classe manifest mancante {:#agp-missing-manifest}
Se la tua app definisce autorizzazioni personalizzate nel file manifest, il plug-in Gradle di Android genera in genere una classe Manifest.java
che include le autorizzazioni personalizzate come costanti di stringa. Il plug-in impacchetta
questa classe con la tua app, in modo da poter fare più facilmente riferimento a queste
autorizzazioni in fase di runtime.
La generazione della classe manifest non funziona nel plug-in Android per Gradle 3.6.0.
Se compili l'app con questa versione del plug-in e fa riferimento
alla classe manifest, potresti visualizzare un'eccezione ClassNotFoundException
. Per risolvere il problema, esegui una delle seguenti operazioni:
-
Fai riferimento alle autorizzazioni personalizzate tramite il nome completo. Ad esempio,
"com.example.myapp.permission.DEADLY_ACTIVITY"
. -
Definisci le tue costanti, come mostrato di seguito:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }