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, e runtimeOnly.
  • 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 file gradle.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 specificare ANDROID_TEST_ORCHESTRATOR, come mostrato di seguito. Per impostazione predefinita, questa proprietà è impostata su HOST, 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"
              }
            }
            
  • 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à su true, il plug-in esegue l'unione di risorse, asset e manifest prima di eseguire i test unitari. I test possono quindi ispezionare com/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'attributo package 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 configurazione lintChecks:

    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 utilizzare processManifest.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.