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

Nuove funzionalità

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

Visualizza associazione

Il binding delle visualizzazioni garantisce la sicurezza in fase di compilazione quando fai riferimento alle visualizzazioni nel tuo codice. Ora puoi sostituire findViewById() con il riferimento alla classe di binding generato 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 scoprire di più, leggi la documentazione relativa al binding della visualizzazione.

Supporto per il plug-in Maven Publish

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

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

Nuovo strumento di pacchettizzazione predefinito

Quando viene compilata la versione di debug dell'app, il plug-in utilizza un nuovo strumento di packaging, chiamato zipflinger, per compilare l'APK. Questo nuovo strumento dovrebbe offrire miglioramenti alla velocità di compilazione. Se il nuovo strumento di pacchetti non funziona come previsto, segnala un bug. Puoi tornare a utilizzare lo strumento di imballaggio precedente 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 progetto. Gradle può generare una traccia di Chrome contenente i timestamp di questi eventi del compilatore, in modo da comprendere meglio il tempo necessario per compilare il progetto. Per generare questo file di attribuzione della compilazione:

  1. Aggiungi il flag -Pandroid.enableProfileJson=true quando esegui una compilazione 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 compilazione nativa nella parte superiore del visualizzatore:

Traccia di attribuzione della compilazione nativa in Chrome

Modifiche al comportamento

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

Librerie native pacchettizzate non compresse per impostazione predefinita

Quando crei l'app, il plug-in ora imposta extractNativeLibs su "false" per impostazione predefinita. In altre parole, le librerie native sono allineate alle pagine e pacchettizzate non compresse. Sebbene questo comporti un aumento delle dimensioni del caricamento, gli utenti beneficiano di quanto segue:

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

Se vuoi che il plug-in Android per Gradle pacchettizzi le librerie native compresse, includi quanto segue nel file 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 DSL per pacchettizzare le librerie native compresse.

Versione NDK predefinita

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

Generazione semplificata di classi R

Il plug-in Gradle per Android semplifica il percorso di compilazione generando un solo classe R per ogni modulo della libreria nel progetto e condividendo questi classi R con le altre dipendenze del modulo. Questa ottimizzazione dovrebbe comportare compilazioni più rapide, ma richiede di tenere presente quanto segue:

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

Rimuovi le risorse mancanti dalla configurazione predefinita.

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

D8 ora rispetta le norme di conservazione di CLASS per le annotazioni

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

Altre modifiche al comportamento

  • aaptOptions.noCompress non è più sensibile alle maiuscole su tutte le piattaforme (sia per APK che per bundle) e rispetta i percorsi che utilizzano caratteri maiuscoli.
  • Il binding dei dati è ora incrementale per impostazione predefinita. Per scoprire di più, consulta il problema 110061530.

  • Tutti i test di unità, inclusi i test di unità Roboelectric, ora sono completamente memorizzati nella cache. Per scoprire di più, consulta il problema 115873047.

Correzioni di bug

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

  • I test di unità Robolectric ora sono supportati nei moduli della libreria che utilizzano l'associazione di dati. Per scoprire di più, consulta il problema 126775542.
  • Ora puoi eseguire attività connectedAndroidTest su più moduli quando la modalità di esecuzione in parallelo di Gradle è attivata.

Problemi noti

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

Prestazioni lente dell'attività Android Lint

Il completamento di Android Lint può richiedere molto più tempo in alcuni progetti a causa di una regressione nell'infrastruttura di analisi, con un conseguente calcolo più lento dei tipi dedotti per le funzioni lambda in determinati costrutti di codice.

Il problema è segnalato come un 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 file manifest, il plug-in Gradle di Android genera in genere una classe Manifest.java che include le autorizzazioni personalizzate come costanti di stringa. Il plug-in impacchetta questa classe con la tua app, in modo da poter fare più facilmente riferimento a queste autorizzazioni in fase di runtime.

La generazione della classe manifest non funziona nel plug-in Android per Gradle 3.6.0. Se compili l'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 autorizzazioni personalizzate tramite il 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";
                  }
                }