Android Gradle Plugin 3.6.0 (febbraio 2020)

Questa versione del plug-in Android richiede i seguenti requisiti:

Nuove funzionalità

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

Visualizza associazione

L'associazione delle viste fornisce la sicurezza in fase di compilazione quando si fa riferimento alle viste in il tuo codice. Ora puoi sostituire findViewById() con un riferimento alla classe di associazione generato automaticamente. Per iniziare a utilizzare Visualizza associazione, includi quanto segue nel file build.gradle di ogni modulo:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

Per saperne di più, leggi il Visualizza Documentazione di associazione.

Supporto per il plug-in Maven publish

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

Per saperne di più, vai alla pagina su come usa il comando Maven per plug-in.

Nuovo strumento di pacchettizzazione predefinito

Quando crei la versione di debug dell'app, il plug-in utilizza un nuovo chiamato zipflinger, per creare l'APK. Questo nuovo dovrebbe migliorare la velocità di creazione. Se il nuovo strumento di pacchettizzazione non funziona come previsto, segnala un bug. Puoi ripristinare con il vecchio strumento di imballaggio includendo quanto segue nella File gradle.properties:

        android.useNewApkCreator=false
      

Attribuzione build nativa

Ora puoi determinare quanto tempo impiega Clang per creare e collegare ogni file C/C++ nel tuo progetto. Gradle può restituire una traccia di Chrome che contiene i timestamp per questi eventi del compilatore, così puoi a comprendere il tempo necessario per creare il tuo progetto. Per eseguire l'output di questa build del file di attribuzione, procedi nel seguente modo:

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

    gradlew assembleDebug -Pandroid.enableProfileJson=true

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

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

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

Traccia di attribuzione build nativa in Chrome

Cambiamenti del comportamento

Quando utilizzi questa versione del plug-in, potresti riscontrare quanto segue cambiamenti nel comportamento.

Librerie native pacchettizzate non compresse da predefinita

Quando crei la tua app, il plug-in ora imposta Da extractNativeLibs a "false" entro predefinito. Ciò significa che le librerie native sono allineate alla pagina e pacchettizzate non compresso. Anche se ciò comporta dimensioni di caricamento maggiori, i tuoi utenti usufruiscono di:

  • Le dimensioni di installazione dell'app sono ridotte perché la piattaforma può accedere allo direttamente dall'APK installato, senza creare una copia dei nelle biblioteche.
  • Dimensioni di download ridotte perché in genere la compressione sul Play Store è migliori se includi librerie native non compresse nell'APK o Android App Bundle.

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

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

Nota: il file manifest extractNativeLibs è stato sostituito dal useLegacyPackaging DSL . Per ulteriori informazioni, consulta la nota di rilascio Utilizza DSL per pacchettizzare i file librerie native.

Versione NDK predefinita

Se scarichi più versioni di 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 build.gradle per eseguire l'override del 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 libreria nel progetto e condividendo queste classi R con altre dipendenze del modulo. Questa ottimizzazione dovrebbe produrre build più veloci, ma è necessario mantenere tieni presente quanto segue:

  • Poiché il compilatore condivide le classi R con il modulo upstream di dipendenze, è importante che ogni modulo del progetto utilizzi un un nome univoco del pacchetto.
  • La visibilità della classe R di una libreria rispetto ad altre dipendenze del progetto è determinato dalla configurazione utilizzata per includere la libreria come la dipendenza. Ad esempio, se la Libreria A include la Libreria B come "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 il parametro Configurazione delle dipendenze di implementation. Per ulteriori informazioni di più, scopri di più dipendenza configurazioni.

Rimuovi le risorse mancanti da quelle predefinite configurazione

Per i moduli Libreria, se includi una risorsa per un linguaggio non includere nell'insieme di risorse predefinito, 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 è più include questa risorsa durante la compilazione del progetto. Questo comportamento cambia dovrebbe comportare meno eccezioni di runtime (Resource Not Found) e una maggiore velocità di compilazione.

D8 ora rispetta il criterio di conservazione CLASS per le annotazioni

Durante la compilazione dell'app, D8 ora tiene conto dell'applicazione delle annotazioni a CLASS di conservazione e queste annotazioni non sono più disponibili all'indirizzo runtime. Questo comportamento si verifica anche quando si imposta l'SDK target dell'app su API di livello 23, che in precedenza consentiva l'accesso a queste annotazioni durante durante la compilazione dell'app utilizzando versioni precedenti di Android Gradle e D8.

Altre modifiche del comportamento

  • aaptOptions.noCompress non è più sensibile alle maiuscole per tutti (per APK e bundle) e rispetta i percorsi che utilizzano in maiuscolo.
  • L'associazione dei dati ora è incrementale per impostazione predefinita. Per saperne di più, vedi problema n. 110061530.

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

Correzioni di bug

Questa versione del plug-in Android per Gradle include il seguente bug correzioni:

  • I test delle unità robotiche sono ora supportati nei moduli della libreria che utilizzano associazione di dati. Per saperne di più, vedi problema n. 126775542.
  • Ora puoi eseguire connectedAndroidTest attività su mentre Gradle parallelo di esecuzione automatica sia abilitata.

Problemi noti

In questa sezione vengono descritti i problemi noti presenti nel plug-in Android per Gradle 3.6.0.

Prestazioni lente dell'attività Lint Android

Il completamento di alcuni progetti Android Lint può richiedere molto più tempo a causa di una regressione nella sua infrastruttura di analisi, con conseguente rallentamento del calcolo di tipi dedotti per lambda in alcuni costrutti di codice.

Il problema viene segnalato come un bug di IDEA e verranno corretti nel plug-in Android Gradle 4.0.

Classe manifest mancante {:#agp-missing-manifest}

Se la tua app definisce autorizzazioni personalizzate nel file manifest, In genere il plug-in Gradle genera una classe Manifest.java che include le autorizzazioni personalizzate come costanti stringa. I pacchetti di plug-in questa classe con la tua app, per poter consultare più facilmente autorizzazioni in fase di runtime.

La generazione della classe manifest non funziona nel plug-in Android Gradle 3.6.0. Se crei la tua app con questa versione del plug-in, questa fa riferimento la classe manifest, potresti vedere un ClassNotFoundException . Per risolvere il problema, procedi in uno dei seguenti modi:

  • 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";
                  }
                }