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 creazione dell'SDK.

Nuove funzionalità

Questa versione del plug-in Android per Gradle include le seguenti nuove funzionalità.

Visualizza associazione

Il binding delle visualizzazioni offre sicurezza in fase di compilazione quando fai riferimento alle visualizzazioni nel tuo codice. Ora puoi sostituire findViewById() con il riferimento alla classe di binding generata 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 saperne di più, leggi la documentazione sul binding delle visualizzazioni.

Supporto del plug-in Maven Publish

Il plug-in Android per Gradle include il supporto per il plug-in Gradle per la pubblicazione Maven, che consente di pubblicare gli artefatti di build in un repository Apache Maven. Il plug-in Android Gradle crea un componente per ogni artefatto della variante di build nel modulo dell'app o della libreria che puoi utilizzare per personalizzare una pubblicazione in un repository Maven.

Per saperne di più, visita la pagina su come utilizzare il plug-in Maven Publish.

Nuovo strumento di pacchettizzazione predefinito

Quando crei la versione di debug della tua app, il plug-in utilizza un nuovo strumento di packaging, chiamato zipflinger, per creare l'APK. Questo nuovo strumento dovrebbe migliorare la velocità di compilazione. Se il nuovo strumento di creazione dei pacchetti non funziona come previsto, segnala un bug. Puoi ripristinare l'utilizzo del vecchio strumento di creazione dei pacchetti 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 tuo progetto. Gradle può generare una traccia di Chrome che contiene i timestamp di questi eventi del compilatore, in modo da poter comprendere meglio il tempo necessario per compilare il progetto. Per generare questo file di attribuzione della build, segui questi passaggi:

  1. Aggiungi il flag -Pandroid.enableProfileJson=true quando esegui una build Gradle. Ad esempio:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Apri il browser Chrome e digita chrome://tracing nella barra di ricerca.

  3. Fai clic sul pulsante Carica e vai a <var>project-root</var>/build/android-profile per trovare il file. Il file si chiama profile-<var>timestamp</var>.json.gz.

Puoi visualizzare i dati di attribuzione della build nativa nella parte superiore del visualizzatore:

Traccia di attribuzione della build nativa in Chrome

Modifiche al comportamento

Quando utilizzi questa versione del plug-in, potresti riscontrare le seguenti modifiche nel comportamento.

Librerie native compresse per impostazione predefinita

Quando crei l'app, il plug-in ora imposta extractNativeLibs su "false" per impostazione predefinita. ovvero le librerie native sono allineate alla pagina e compresse. Sebbene ciò comporti dimensioni di caricamento maggiori, i tuoi utenti beneficiano di quanto segue:

  • Dimensioni di installazione dell'app più ridotte perché la piattaforma può accedere alle librerie native direttamente dall'APK installato, senza creare una copia delle librerie.
  • Dimensioni di download più ridotte perché la compressione del Play Store è in genere migliore quando includi librerie native non compresse nell'APK o nell'Android App Bundle.

Se vuoi che il plug-in Android Gradle comprima le librerie native, includi quanto segue nel 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 linguaggio specifico del dominio per comprimere le librerie native.

Versione NDK predefinita

Se scarichi più versioni dell'NDK, il plug-in Android Gradle ora seleziona una versione predefinita da utilizzare per la compilazione dei file di codice sorgente. In precedenza, il plug-in selezionava l'ultima versione scaricata dell'NDK. Utilizza la proprietà android.ndkVersion nel file build.gradle del modulo per ignorare il valore predefinito selezionato dal plug-in.

Generazione semplificata della classe R

Il plug-in Android Gradle semplifica il classpath di compilazione generando una sola classe R per ogni modulo della libreria nel progetto e condividendo queste classi R con altre dipendenze del modulo. Questa ottimizzazione dovrebbe comportare build più veloci, ma richiede di tenere presente quanto segue:

  • Poiché il compilatore condivide le classi R con le dipendenze dei moduli upstream, è importante che ogni modulo del progetto utilizzi un nome del 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 dipendenza. Ad esempio, se la libreria A include la libreria B come dipendenza "api", la libreria A e altre librerie che dipendono dalla libreria A hanno accesso alla classe R della libreria B. Tuttavia, altre librerie potrebbero non avere accesso alla classe R della libreria B. Se la libreria A utilizza la configurazione delle dipendenze implementation. Per saperne di più, leggi le configurazioni delle dipendenze.

Rimuovi le risorse mancanti dalla configurazione predefinita

Per i moduli della libreria, se includi una risorsa per una lingua che non è inclusa nel set predefinito di risorse, ad esempio se includi hello_world come risorsa stringa in /values-es/strings.xml, ma non definisci la risorsa in /values/strings.xml, il plug-in Android Gradle non include più la risorsa durante la compilazione del progetto. Questa modifica del comportamento dovrebbe comportare un minor numero di eccezioni di runtime Resource Not Found e una maggiore velocità di compilazione.

D8 ora rispetta le norme di conservazione CLASS per le annotazioni

Durante la compilazione dell'app, D8 ora rispetta i casi in cui le annotazioni applicano un criterio di conservazione CLASS e queste annotazioni non sono più disponibili in fase di runtime. Questo comportamento si verifica anche quando l'SDK di destinazione dell'app è impostato sul livello API 23, che in precedenza consentiva l'accesso a queste annotazioni durante l'esecuzione durante la compilazione dell'app utilizzando versioni precedenti del plug-in Android Gradle e D8.

Altre modifiche al comportamento

  • aaptOptions.noCompress non fa più distinzione tra maiuscole e minuscole su tutte le piattaforme (sia per gli APK che per i bundle) e rispetta i percorsi che utilizzano caratteri maiuscoli.
  • Il data binding ora è incrementale per impostazione predefinita. Per saperne di più, consulta il problema n. 110061530.

  • Tutti i test delle unità, inclusi i test delle unità Roboelectric, ora sono completamente memorizzabili nella cache. Per saperne di più, consulta il problema n. 115873047.

Correzioni di bug

Questa versione del plug-in Android per Gradle include le seguenti correzioni di bug:

  • I test unitari Robolectric sono ora supportati nei moduli della libreria che utilizzano il data binding. Per saperne di più, consulta il problema n. 126775542.
  • Ora puoi eseguire attività connectedAndroidTest su più moduli mentre è abilitata la modalità di esecuzione parallela di Gradle.

Problemi noti

Questa sezione descrive i problemi noti esistenti nel plug-in Android per Gradle 3.6.0.

Prestazioni lente dell'attività Android Lint

Android Lint può richiedere molto più tempo per essere completato in alcuni progetti a causa di una regressione nella sua infrastruttura di analisi, con conseguente calcolo più lento dei tipi dedotti per le espressioni lambda in determinate costruzioni di codice.

Il problema viene segnalato come 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 manifest, il plug-in Gradle per Android in genere genera una classe Manifest.java che include le tue autorizzazioni personalizzate come costanti stringa. Il plug-in include questa classe nella tua app, in modo che tu possa fare riferimento più facilmente a queste autorizzazioni in fase di runtime.

La generazione della classe manifest non funziona nel plug-in Android per Gradle 3.6.0. Se crei la tua 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 tue autorizzazioni personalizzate in base al 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";
                  }
                }