Plug-in Android per Gradle 3.0.0 (ottobre 2017)
Il plug-in Android per Gradle 3.0.0 include una serie di modifiche volte a risolvere i problemi di prestazioni dei progetti di grandi dimensioni.
Ad esempio, in un progetto scheletro di esempio con circa 130 moduli e un numero elevato di dipendenze esterne (ma senza codice o risorse), puoi riscontrare miglioramenti delle prestazioni simili ai seguenti:
Versione del plug-in Android + versione di Gradle | Plug-in Android 2.2.0 + Gradle 2.14.1 | Plug-in Android 2.3.0 + Gradle 3.3 | Plug-in Android 3.0.0 + Gradle 4.1 |
---|---|---|---|
Configurazione (ad es. esecuzione di ./gradlew --help ) |
~2 minuti | ~9 s | ~2,5 s |
Modifica di una riga Java (modifica dell'implementazione) | ~2 min 15 sec | ~29 s | ~6,4 s |
Alcune di queste modifiche interrompono le build esistenti. Pertanto, prima di utilizzare il nuovo plug-in, valuta l'impegno necessario per eseguire la migrazione del progetto.
Se non noti i miglioramenti delle prestazioni descritti sopra, segnala un bug e includi una traccia della build utilizzando Gradle Profiler.
Questa versione del plug-in Android richiede quanto segue:
Versione minima | Versione predefinita | Note | |
---|---|---|---|
Gradle | 4.1 | 4.1 | Per scoprire di più, consulta la sezione Aggiornare Gradle. |
Strumenti di compilazione SDK | 26.0.2 | 26.0.2 | Installa o configura gli strumenti di creazione dell'SDK. Con questo aggiornamento, non è più necessario specificare una versione per gli strumenti di compilazione: il plug-in utilizza per impostazione predefinita la versione minima richiesta. Pertanto, ora puoi rimuovere la proprietà android.buildToolsVersion. |
3.0.1 (novembre 2017)
Si tratta di un aggiornamento secondario per supportare Android Studio 3.0.1 e include correzioni di bug e miglioramenti delle prestazioni generali.
Ottimizzazioni
- Migliore parallelismo per i progetti multimodulo tramite un grafico delle attività con granularità fine.
- Quando apporti modifiche alla dipendenza, Gradle esegue build più veloci non ricompilando i moduli che non hanno accesso all'API della dipendenza.
Devi limitare le dipendenze che espongono le proprie API ad altri moduli
utilizzando
le nuove configurazioni delle dipendenze di Gradle:
implementation
,api
,compileOnly
, eruntimeOnly
. - Velocità di compilazione incrementale più rapida grazie al dexing per classe. Ogni classe viene
ora compilata in file DEX separati e vengono ricompilate solo le classi
modificate. Dovresti anche aspettarti velocità di compilazione migliorate per
le app che impostano
minSdkVersion
su 20 o meno e utilizzano multi-dex legacy. - Velocità di compilazione migliorata grazie all'ottimizzazione di alcune attività per l'utilizzo di output memorizzati nella cache. Per usufruire di questa ottimizzazione, devi prima attivare la cache di build Gradle.
- Elaborazione incrementale delle risorse migliorata utilizzando AAPT2, ora
abilitato per impostazione predefinita. Se riscontri problemi durante l'utilizzo di AAPT2,
segnala un bug. Puoi anche
disattivare AAPT2 impostando
android.enableAapt2=false
nel filegradle.properties
e riavviando il daemon Gradle eseguendo./gradlew --stop
dalla riga di comando.
Nuove funzionalità
- Gestione delle dipendenze in base alle varianti. Quando crei una determinata variante di un modulo, il plug-in ora corrisponde automaticamente alle varianti delle dipendenze del modulo della libreria locale alla variante del modulo che stai creando.
- Include un nuovo plug-in del modulo delle funzionalità per supportare Android Instant Apps e l' SDK Android Instant Apps (che puoi scaricare utilizzando SDK Manager). Per scoprire di più sulla creazione di moduli di funzionalità con il nuovo plug-in, leggi Struttura di un'app istantanea con più funzionalità.
- Supporto integrato per l'utilizzo di determinate funzionalità del linguaggio Java 8 e delle librerie Java 8. Jack è ora deprecato e non più necessario e devi prima disattivarlo per utilizzare il supporto migliorato di Java 8 integrato nella toolchain predefinita. Per maggiori informazioni, leggi Utilizzare le funzionalità del linguaggio Java 8.
-
È stato aggiunto il supporto per l'esecuzione di test con Android Test Orchestrator, che consente di eseguire ogni test dell'app all'interno della propria chiamata di Instrumentation. Poiché ogni test viene eseguito nella propria istanza di Instrumentation, qualsiasi stato condiviso tra i test non si accumula sulla CPU o sulla memoria del dispositivo. Inoltre, anche se un test si arresta in modo anomalo, viene interrotta solo la relativa istanza di Instrumentation, quindi gli altri test vengono comunque eseguiti.
- È stato aggiunto
testOptions.execution
per determinare se utilizzare l'orchestrazione dei test sul dispositivo. Se vuoi utilizzare Android Test Orchestrator, devi specificareANDROID_TEST_ORCHESTRATOR
, come mostrato di seguito. Per impostazione predefinita, questa proprietà è impostata suHOST
, che disattiva l'orchestrazione sul dispositivo ed è il metodo standard di esecuzione dei test.
Groovy
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }
Kotlin
android { testOptions { execution = "ANDROID_TEST_ORCHESTRATOR" } }
- È stato aggiunto
-
La nuova configurazione delle dipendenze
androidTestUtil
ti consente di installare un altro APK di assistenza per i test prima di eseguire i test di strumentazione, ad esempio Android Test Orchestrator:Groovy
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }
Kotlin
dependencies { androidTestUtil("com.android.support.test:orchestrator:1.0.0") ... }
-
È stato aggiunto
testOptions.unitTests.includeAndroidResources
per supportare i test unitari che richiedono risorse Android, come Robolectric. Quando imposti questa proprietà sutrue
, il plug-in esegue l'unione di risorse, asset e manifest prima di eseguire i test unitari. I test possono quindi ispezionarecom/android/tools/test_config.properties
nel classpath per le seguenti chiavi:-
android_merged_assets
: il percorso assoluto della directory degli asset uniti.Nota: per i moduli della libreria, gli asset uniti non contengono gli asset delle dipendenze (vedi problema #65550419).
-
android_merged_manifest
: il percorso assoluto del file manifest unito. -
android_merged_resources
: il percorso assoluto della directory delle risorse unite, che contiene tutte le risorse del modulo e di tutte le relative dipendenze. -
android_custom_package
: il nome del pacchetto della classe R finale. Se modifichi dinamicamente l'ID applicazione, questo nome del pacchetto potrebbe non corrispondere all'attributopackage
nel manifest dell'app.
-
- Supporto per i caratteri come risorse (una nuova funzionalità introdotta in Android 8.0 (livello API 26)).
- Supporto per APK specifici per lingua con Android Instant Apps SDK 1.1 e versioni successive.
-
Ora puoi modificare la directory di output per il progetto di build nativa esterna, come mostrato di seguito:
Groovy
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }
Kotlin
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory = "./outputs/cmake" } } }
- Ora puoi utilizzare CMake 3.7 o versioni successive durante la creazione di progetti nativi da Android Studio.
-
La nuova configurazione delle dipendenze
lintChecks
ti consente di creare un file JAR che definisce regole lint personalizzate e di pacchettizzarlo nei progetti AAR e APK.Le regole lint personalizzate devono appartenere a un progetto separato che restituisce un singolo file JAR e include solo dipendenze
compileOnly
. Altri moduli di app e librerie possono quindi dipendere dal tuo progetto lint utilizzando la configurazionelintChecks
:Groovy
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks project(':lint-checks') }
Kotlin
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks(project(":lint-checks")) }
Modifiche al comportamento
- Il plug-in Android 3.0.0 rimuove alcune API e la build non funzionerà
se le utilizzi. Ad esempio, non puoi più utilizzare l'API Variants per
accedere agli oggetti
outputFile()
o utilizzareprocessManifest.manifestOutputFile()
per ottenere il file manifest per ogni variante. Per saperne di più, leggi Modifiche all'API. - Non è più necessario specificare una versione per gli strumenti di compilazione (quindi ora puoi rimuovere la proprietà
android.buildToolsVersion
). Per impostazione predefinita, il plug-in utilizza automaticamente la versione minima richiesta degli strumenti di compilazione per la versione del plug-in Android che stai utilizzando. - Ora puoi attivare/disattivare la compressione PNG nel blocco
buildTypes
, come mostrato di seguito. La compressione PNG è attivata per impostazione predefinita per tutte le build, ad eccezione delle build di debug, perché aumenta i tempi di compilazione per i progetti che includono molti file PNG. Pertanto, per migliorare i tempi di compilazione per altri tipi di build, devi disattivare la compressione PNG o convertire le immagini in WebP.Groovy
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }
Kotlin
android { buildTypes { release { // Disables PNG crunching for the release build type. isCrunchPngs = false } } }
- Il plug-in Android ora crea automaticamente target eseguibili che configuri nei tuoi progetti CMake esterni.
- Ora devi
aggiungere processori
di annotazioni al classpath del processore utilizzando la
configurazione delle dipendenze
annotationProcessor
. - L'utilizzo della proprietà
ndkCompile
ritirata è ora più limitato. Ti consigliamo invece di eseguire la migrazione all'utilizzo di CMake o ndk-build per compilare il codice nativo che vuoi includere nel tuo APK. Per saperne di più, leggi l'articolo Eseguire la migrazione da ndkcompile.