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 del rendimento 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 min Circa 9 secondi ~2,5 s
Modifica Java di una riga (modifica di implementazione) 2 min 15 sec circa ~29 s ~6,4 s

Alcune di queste modifiche non sono compatibili con le build esistenti. Pertanto, prima di utilizzare il nuovo plug-in, devi valutare l'
impegno necessario per eseguire la migrazione del progetto.

Se non riscontri i miglioramenti delle prestazioni descritti sopra, segnala un bug e includi una traccia della compilazione 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 compilazione dell'SDK. Con questo aggiornamento non è più necessario specificare una versione per gli strumenti di compilazione: per impostazione predefinita, il plug-in utilizza la versione minima richiesta. Ora puoi rimuovere la proprietà android.buildToolsVersion.

3.0.1 (novembre 2017)

Si tratta di un aggiornamento minore per supportare Android Studio 3.0.1 e include correzioni di bug e miglioramenti delle prestazioni generali.

Ottimizzazioni

  • Miglior parallelismo per i progetti multi-modulo tramite un grafico delle attività granulare.
  • Quando apporti modifiche alla dipendenza, Gradle esegue build più veloci non compilando nuovamente i moduli che non hanno accesso all'API della dipendenza. Devi limitare le dipendenze che divulgano le API ad altri moduli utilizzando le nuove configurazioni delle dipendenze di Gradle: implementation, api, compileOnly e runtimeOnly.
  • Maggiore velocità di compilazione incrementale grazie al dexing per classe. Ora ogni classe viene compilata in file DEX separati e solo le classi modificate vengono sottoposte nuovamente a decompilazione. Dovresti anche aspettarti velocità di compilazione migliorate per le app che impostano minSdkVersion su 20 o meno e utilizzano multi-dex legacy.
  • Miglioramento delle velocità di compilazione mediante l'ottimizzazione di determinate attività per l'utilizzo di output memorizzati nella cache. Per usufruire di questa ottimizzazione, devi prima attivare la cache di compilazione di Gradle.
  • Elaborazione delle risorse incrementali migliorata utilizzando AAPT2, che ora è attivata per impostazione predefinita. Se riscontri problemi durante l'utilizzo di AAPT2, segnala un bug. Puoi anche disattivare AAPT2 impostando android.enableAapt2=false nel gradle.properties file e riavviando il daemon Gradle eseguendo ./gradlew --stop dalla riga di comando.

Nuove funzionalità

  • Gestione delle dipendenze consapevole delle varianti. Quando crei una determinata variante di un modulo, ora il plug-in associa automaticamente le varianti delle dipendenze dei moduli della libreria locale alla variante del modulo che stai creando.
  • Include un nuovo plug-in del modulo di 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, consulta 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. Per prima cosa, devi disattivare Jack per utilizzare il supporto migliorato di Java 8 integrato nella toolchain predefinita. Per ulteriori informazioni, consulta 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 continuano a essere 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, il che disattiva l'orchestrazione sul dispositivo ed è il metodo standard per eseguire i 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 helper 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 di unità che richiedono risorse Android, come Roboelectric. Se imposti questa proprietà su true, il plug-in esegue l'unione di risorse, asset e manifest prima di eseguire i test di unità. I test possono quindi esaminare com/android/tools/test_config.properties nel percorso di classe 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 issue #65550419).

    • android_merged_manifest: il percorso assoluto del file manifest unito.

    • android_merged_resources: il percorso assoluto alla directory delle risorse unite, che contiene tutte le risorse del modulo e tutte le sue 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 dei caratteri come risorse (una nuova funzionalità introdotta in Android 8.0 (livello API 26)).
  • Supporto per gli APK specifici per lingua con Android SDK Instant Apps 1.1 e versioni successive.
  • Ora puoi modificare la directory di output per il progetto di compilazione 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 per compilare progetti nativi da Android Studio.
  • La nuova configurazione delle dipendenze lintChecks ti consente di compilare un JAR che definisce regole di lint personalizzate e di impacchettarlo nei progetti AAR e APK.

    Le regole di lint personalizzate devono appartenere a un progetto separato che genera un singolo file JAR e include solo dipendenze compileOnly. Altri moduli di app e librerie possono dipendere dal 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 compilazione non funzionerà se le utilizzi. Ad esempio, non puoi più utilizzare l'API Variants per accedere agli oggetti outputFile() o utilizzare processManifest.manifestOutputFile() per recuperare il file manifest per ogni variante. Per scoprire di più, consulta 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 in uso.
  • Ora puoi attivare/disattivare la compressione PNG nel blocco buildTypes, come mostrato di seguito. L'ottimizzazione PNG è abilitata per impostazione predefinita per tutte le build tranne le 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 l'ottimizzazione 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
              }
            }
          }
          
  • Ora il plug-in Android compila automaticamente i target eseguibili configurati nei progetti CMake esterni.
  • Ora devi aggiungere gli elaboratori di annotazione al percorso di classe dell'elaboratore utilizzando la configurazione delle dipendenze annotationProcessor.
  • L'utilizzo di ndkCompile, che è stato ritirato, ora è più limitato. Ti consigliamo di eseguire la migrazione a CMake o ndk-build per compilare il codice nativo che vuoi includere nel tuo APK. Per saperne di più, consulta Eseguire la migrazione da ndkcompile.