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 secondi ~2,5 secondi
Modifica di una riga di codice Java (modifica dell'implementazione) ~2 minuti e 15 secondi ~29 secondi ~6,4 secondi

Alcune di queste modifiche interrompono le build esistenti. Pertanto, prima di utilizzare il nuovo plug-in, valuta
l'impegno necessario per la migrazione del progetto.

Se non riscontri i miglioramenti delle prestazioni descritti sopra, segnala un bug e includi una traccia della build utilizzando il Gradle Profiler.

Questa versione del plug-in Android richiede quanto segue:

Versione minima Versione predefinita Note
Gradle 4.1 4.1 Per saperne di più, consulta la sezione Aggiornare Gradle.
Strumenti di build dell'SDK 26.0.2 26.0.2 Installa o configura gli strumenti di build dell'SDK. Con questo aggiornamento, non è più necessario specificare una versione per gli strumenti di build: 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 generali e miglioramenti delle prestazioni.

Ottimizzazioni

  • Migliore parallelismo per i progetti multi-modulo tramite un grafico delle attività con granularità fine.
  • Quando apporti modifiche alla dipendenza, Gradle esegue build più rapide non ricompilando i moduli che non hanno accesso all'API di quella dipendenza. Devi limitare le dipendenze che perdono le relative API in altri moduli utilizzando le nuove configurazioni delle dipendenze di Gradle:implementation, api, compileOnly, e runtimeOnly.
  • Velocità di build incrementale più rapida grazie al dexing per classe. Ogni classe viene ora compilata in file DEX separati e solo le classi che sono modificate vengono ridexate. Dovresti anche riscontrare una maggiore velocità di build per le app che impostano minSdkVersion su 20 o inferiore e utilizzano il multi-dex legacy.
  • Velocità di build migliorate grazie all'ottimizzazione di determinate attività per l'utilizzo degli output memorizzati nella cache. Per usufruire di questa ottimizzazione, devi prima abilitare la cache di build di 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 abbina automaticamente le 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 le app istantanee Android e l' SDK per app istantanee Android (che puoi scaricare utilizzando SDK Manager). Per saperne di più sulla creazione di moduli delle 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 librerie Java 8. Jack è ora obsoleto e non è più necessario e devi prima disattivarlo per utilizzare il supporto Java 8 migliorato integrato nella toolchain predefinita. Per saperne di più, leggi Utilizzare le funzionalità del linguaggio Java 8.
  • È stato aggiunto il supporto per l'esecuzione di test con Android Test Orchestrator, che ti consente di eseguire ogni test della tua app nella 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 usare 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.

    Alla moda

            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:

    Alla moda

            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 delle unità che richiedono risorse Android, come Roboelectric. Quando imposti questa proprietà su true, il plug-in esegue l'unione di risorse, asset e manifest prima di eseguire i test delle unità. I test possono quindi controllare 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 n. 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 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 gli 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 progetto, come mostrato di seguito:

    Alla moda

            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 quando crei 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 inserirle nei progetti AAR e APK.

    Le regole lint personalizzate devono appartenere a un progetto separato che genera un singolo file JAR e include solo compileOnly dipendenze. Altri moduli di app e librerie possono quindi dipendere dal progetto lint utilizzando la configurazione lintChecks:

    Alla moda

            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 verrà interrotta 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 build (quindi, ora puoi rimuovere la proprietà android.buildToolsVersion). Per impostazione predefinita, il plug-in utilizza automaticamente la versione minima richiesta degli strumenti di build per la versione del plug-in Android che stai utilizzando.
  • Ora puoi attivare/disattivare la compressione PNG nel buildTypes blocco, 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 build per i progetti che includono molti file PNG. Pertanto, per migliorare i tempi di build per altri tipi di build, devi disattivare la compressione PNG o convertire le immagini in WebP.

    Alla moda

          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 le destinazioni eseguibili che configuri nei progetti CMake esterni.
  • Ora devi aggiungere i processori di annotazione al classpath del processore utilizzando la annotationProcessor configurazione delle dipendenze.
  • L'utilizzo di ndkCompile obsoleto è ora più limitato. Devi invece eseguire la migrazione all'utilizzo di CMake o ndk-build per compilare codice nativo che vuoi inserire nel pacchetto APK. Per saperne di più, leggi Eseguire la migrazione da ndkcompile.