Plug-in Android Gradle 3.6.0 (febbraio 2020)

Questa versione del plug-in Android richiede quanto segue:

Nuove funzionalità

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

Visualizza associazione

L'associazione delle visualizzazioni offre sicurezza in fase di compilazione quando fai riferimento alle viste nel codice. Ora puoi sostituire findViewById() con il riferimento alla classe di associazione generato automaticamente. Per iniziare a utilizzare l'associazione Visualizza, 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 sull'associazione delle visualizzazioni.

Supporto per il plug-in Maven publish

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

Per scoprire di più, consulta la pagina su come utilizzare il plug-in Maven Pubblica.

Nuovo strumento di pacchettizzazione predefinito

Durante la creazione della versione di debug dell'app, il plug-in utilizza un nuovo strumento di pacchetto, chiamato zipflinger, per creare l'APK. Questo nuovo strumento dovrebbe fornire miglioramenti della velocità di build. Se il nuovo strumento di presentazione non funziona come previsto, segnala un bug. Puoi ripristinare il vecchio strumento di pacchettizzazione includendo quanto segue nel file gradle.properties:

        android.useNewApkCreator=false
      

Attribuzione nativa build

Ora puoi determinare il tempo necessario a Clang per creare e collegare ciascun file C/C++ nel tuo progetto. Gradle può generare una traccia di Chrome contenente timestamp per questi eventi di compilazione, in modo che tu possa comprendere meglio il tempo necessario per creare il tuo progetto. Per generare questo file di attribuzione della build:

  1. Aggiungi il flag -Pandroid.enableProfileJson=true durante l'esecuzione di una build Gradle. Ecco alcuni esempi:

    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 nome del file è profile-<var>timestamp</var>.json.gz.

Puoi visualizzare i dati di attribuzione della build nativa nella parte superiore dello spettatore:

Traccia di attribuzione della build nativa in Chrome

Modifiche del comportamento

Quando utilizzi questa versione del plug-in, potresti riscontrare i seguenti cambiamenti di comportamento.

Librerie native pacchettizzate non compresse per impostazione predefinita

Quando crei la tua app, il plug-in ora imposta extractNativeLibs su "false" per impostazione predefinita. In altre parole, le librerie native sono allineate di pagina e pacchettizzate non compresse. Anche se ciò comporta dimensioni di caricamento maggiori, i tuoi utenti beneficiano di quanto segue:

  • Dimensioni di installazione delle 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é in genere la compressione sul Play Store è migliore se includi librerie native non compresse nell'APK o nell'Android App Bundle.

Se vuoi che il plug-in Android Gradle pacchettizzi librerie native compresse, includi quanto segue nel file manifest dell'app:

        <application
          android:extractNativeLibs="true"
          ... >
        </application>
        
      

Nota: l'attributo del file manifest extractNativeLibs è stato sostituito dall'opzione DSL useLegacyPackaging. Per ulteriori informazioni, consulta la nota di rilascio Utilizzare la connessione DSL per pacchettizzare librerie native compresse.

Versione NDK predefinita

Se scarichi più versioni dell'NDK, il plug-in Android per Gradle seleziona ora una versione predefinita da utilizzare per compilare i 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 sostituire il valore predefinito selezionato dal plug-in.

Generazione semplificata di classi R

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

  • Poiché il compilatore condivide le classi R con dipendenze dei moduli upstream, è importante che ogni modulo del progetto utilizzi un nome di pacchetto univoco.
  • La visibilità della classe R di una libreria rispetto ad 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 le 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 scoprire di più, scopri di più sulle configurazioni delle dipendenze.

Rimuovi le risorse mancanti dalla configurazione predefinita

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

D8 ora rispetta il criterio di conservazione CLASS per le annotazioni

Quando compila la tua app, D8 ora rispetta l'applicazione di un criterio di conservazione CLASS alle annotazioni, che non sono più disponibili durante il runtime. Questo comportamento si verifica anche quando l'SDK di destinazione dell'app viene impostato al 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 del 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.
  • L'associazione di dati è ora incrementale per impostazione predefinita. Per scoprire di più, consulta il problema n. 110061530.

  • Tutti i test delle unità, inclusi quelli delle unità Roboelettriche, sono ora completamente memorizzabili nella cache. Per scoprire 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 delle unità Robolectric sono ora supportati nei moduli della libreria che utilizzano l'associazione di dati. Per scoprire di più, consulta il problema n. 126775542.
  • Ora puoi eseguire connectedAndroidTest attività su più moduli mentre è abilitata la modalità di esecuzione parallela di Gradle.

Problemi noti

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

Prestazioni lente dell'attività Lint di Android

Il completamento di Android Lint può richiedere molto più tempo in alcuni progetti a causa di una regressione nella sua infrastruttura di analisi, che comporta un calcolo più lento dei tipi dedotti per le lambda in alcuni costrutti di codice.

Il problema viene 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 Android Gradle genera in genere una classe Manifest.java che include le tue autorizzazioni personalizzate come costanti delle stringhe. Il plug-in pacchettizza questa classe con la tua app, così puoi fare riferimento a queste autorizzazioni più facilmente in fase di runtime.

La generazione della classe del manifest viene interrotta nel plug-in Android Gradle 3.6.0. Se crei l'app con questa versione del plug-in, che fa riferimento alla classe manifest, potresti visualizzare un'eccezione ClassNotFoundException. Per risolvere il problema, esegui una delle seguenti operazioni:

  • Fai riferimento alle autorizzazioni personalizzate indicando il loro 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";
                  }
                }