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 saperne di più, consulta la sezione Aggiornare Gradle.
Strumenti di build dell'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

L'associazione di visualizzazioni fornisce la sicurezza in fase di compilazione quando fai riferimento alle visualizzazioni in your code. Ora puoi sostituire findViewById() con il riferimento alla classe di binding generata automaticamente. Per iniziare a utilizzare l'associazione di 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 sull'associazione di visualizzazioni View Binding.

Supporto per il plug-in Maven Publish

Il plug-in Android per Gradle include il supporto per il plug-in Gradle Maven Publish, che ti consente di pubblicare gli artefatti di build in un repository Apache Maven. Il plug-in Android per 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 packaging predefinito

Quando crei la versione di debug dell'app, il plug-in utilizza un nuovo strumento di packaging, chiamato zipflinger, per creare l'APK. Questo nuovo strumento dovrebbe migliorare la velocità di build. Se il nuovo strumento di packaging non funziona come previsto, segnala un bug. Puoi ripristinare l'utilizzo del vecchio strumento di packaging includendo quanto segue nel tuo gradle.properties file:

        android.useNewApkCreator=false
      

Attribuzione della build nativa

Ora puoi determinare il tempo necessario a Clang per creare 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 comprendere meglio il tempo necessario per creare il progetto. Per generare questo file di attribuzione della build:

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

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Apri il browser Chrome e digita chrome://tracing in the 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 al funzionamento.

Librerie native compresse per impostazione predefinita

Quando crei l'app, il plug-in ora imposta extractNativeLibs su "false" per impostazione predefinita. Ciò significa che le librerie native sono allineate alla pagina e compresse. Sebbene ciò comporti una dimensione di caricamento maggiore, gli utenti traggono vantaggio da quanto segue:

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

Se vuoi che il plug-in Android per Gradle comprima le librerie native, 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 saperne di più, consulta la nota di rilascio Utilizzare la DSL per comprimere le librerie native.

Versione NDK predefinita

Se scarichi più versioni dell'NDK, il plug-in Android per Gradle ora seleziona 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 della classe R

Il plug-in Android per 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 devi tenere presente quanto segue:

  • Poiché il compilatore condivide le classi R con le dipendenze del modulo upstream è importante che ogni modulo del progetto utilizzi un nome del pacchetto univoco.
  • La visibilità della classe R di una libreria per 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 implementation configurazione della dipendenza. Per saperne di più, leggi le configurazioni delle dipendenze.

Rimuovere le risorse mancanti dalla configurazione predefinita

Per i moduli della libreria, se includi una risorsa per una lingua che non includi nel set di risorse predefinito, 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 per Gradle non include più la risorsa durante la compilazione del progetto. Questa modifica al comportamento dovrebbe comportare un minor numero di eccezioni di runtime Resource Not Found e una maggiore velocità di build.

D8 ora rispetta la policy di conservazione CLASS per le annotazioni

Quando compila l'app, D8 ora rispetta quando le annotazioni applicano una policy di conservazione CLASS e queste annotazioni non sono più disponibili in fase di runtime. Questo comportamento si verifica anche quando imposti l'SDK target dell'app sul 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 per Gradle e D8.

Altre modifiche al funzionamento

  • aaptOptions.noCompress non fa più distinzione tra maiuscole e minuscole 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 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 fixes:

  • I test delle unità Robolectric ora sono supportati nei moduli della libreria che utilizzano l'associazione di dati. Per saperne di più, consulta il problema n. 126775542.
  • Ora puoi eseguire le attività connectedAndroidTest su più moduli mentre è attiva 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 su 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 strutture di codice.

Il problema è 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 file manifest, il plug-in Android per Gradle in genere genera una classe Manifest.java che include le autorizzazioni personalizzate come costanti stringa. Il plug-in comprime questa classe con l'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 l'app con questa versione del plug-in e fai riferimento alla classe manifest, potresti visualizzare un'eccezione ClassNotFoundException. Per risolvere questo problema, esegui una delle seguenti operazioni:

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