Analizza la tua build con lo Strumento di analisi APK

Android Studio include uno Analizzatore APK che fornisce informazioni immediate sulla composizione dell'APK o dell'Android App Bundle al termine del processo di compilazione. Lo Strumento di analisi APK può aiutarti a ridurre il tempo dedicato al debug delle risorse e ai file DEX all'interno della tua app, nonché a ridurre le dimensioni degli APK. Lo Strumento di analisi APK è disponibile anche dalla riga di comando con apkanalyzer.


Con lo Strumento di analisi APK puoi:

  • Visualizza le dimensioni assolute e relative dei file nell'app, ad esempio i file di risorse DEX e Android.
  • Informazioni sulla composizione dei file DEX.
  • Visualizza rapidamente le versioni finali dei file nell'app, ad esempio il file AndroidManifest.xml.
  • Fai un confronto affiancato tra due APK o app bundle.

Esistono tre modi per accedere allo Strumento di analisi APK quando un progetto è aperto:

  • Trascina un APK o un app bundle nella finestra Editor di Android Studio.
  • Passa alla vista Progetto nella finestra Progetto, quindi fai doppio clic sull'APK nella directory build/output/apks/ predefinita.
  • Seleziona Crea > Analizza APK nella barra dei menu, poi seleziona il tuo APK o app bundle.

Visualizzare le informazioni su file e dimensioni

Gli APK sono file che seguono il formato file ZIP. Lo Strumento di analisi APK visualizza ogni file o cartella come un'entità che puoi espandere per spostarti nelle cartelle. La gerarchia delle entità rispecchia la struttura dei file e delle cartelle nel file APK.

Lo Strumento di analisi APK mostra le dimensioni del file non elaborato e i valori delle dimensioni del file di download per ogni entità, come mostrato nella Figura 1. Le dimensioni del file non elaborato rappresentano le dimensioni non compresse dell'entità sul disco. Dimensioni download rappresenta le dimensioni compresse stimate dell'entità così come verrebbero pubblicate da Google Play. La % delle dimensioni di download totali indica la percentuale delle dimensioni di download totali dell'APK rappresentate dall'entità.

Figura 1. Dimensioni dei file nello strumento Analizzatore APK.

Visualizza il file AndroidManifest.xml

Se il tuo progetto include più file AndroidManifest.xml, ad esempio per versioni di prodotti, o include librerie che forniscono anche un file manifest, questi vengono uniti in un unico file nella tua app. Questo file manifest è in genere un file binario all'interno dell'APK o dell'app bundle, ma quando viene selezionato nello strumento di analisi APK, il formato XML di questa entità viene ricostruito e presentato.

Questo visualizzatore ti aiuta a comprendere le eventuali modifiche che potrebbero essere state apportate alla tua app durante la build. Ad esempio, puoi vedere in che modo il file AndroidManifest.xml di una libreria da cui dipende la tua applicazione viene unito nel file AndroidManifest.xml finale.

Inoltre, questo visualizzatore fornisce alcune funzionalità di lint. Gli avvisi o gli errori vengono visualizzati nell'angolo in alto a destra. La Figura 2 mostra un errore segnalato per il file manifest selezionato.

Figura 2. Viene visualizzata un'icona di errore in alto a destra per il file manifest selezionato.

Visualizza file DEX

Il visualizzatore di file DEX dello strumento di analisi APK ti dà accesso immediato alle informazioni sottostanti nei file DEX della tua app. Il visualizzatore fornisce classe, pacchetti, riferimento totale e conteggio delle dichiarazioni, che possono aiutarti a decidere se utilizzare il multidex o come rimuovere le dipendenze per scendere al di sotto del limite DEX di 64.000.

La Figura 3 mostra un'app di medie dimensioni che presenta un valore inferiore al limite di 64.000 DEX. Ogni pacchetto, classe e metodo all'interno del file DEX include i conteggi nelle colonne defined Methods (Metodi definiti) e Referenced Methods.

La colonna Metodi di riferimento conteggia tutti i metodi a cui fa riferimento il file DEX. In genere questo include metodi definiti nel codice, librerie di dipendenze e metodi definiti nei pacchetti Java e Android standard utilizzati dal codice. Questi sono i metodi conteggiati per il limite di 64.000 metodi in ogni file DEX.

La colonna Definisci i metodi conteggia solo i metodi definiti in uno dei file DEX, pertanto questo numero è un sottoinsieme di Metodi di riferimento.

Figura 3. Un'app di medie dimensioni.

Filtrare la visualizzazione ad albero dei file DEX

Appena sopra l'elenco Class, lo strumento di analisi APK fornisce filtri per visualizzare i contenuti del file DEX selezionato, come mostrato nella Figura 4.

Figura 4. Filtri DEX impostati per visualizzare campi e metodi per BuildConfig.

Per utilizzare i filtri per visualizzare tutti i metodi e i campi all'interno di una classe, segui questi passaggi:

  1. Nell'elenco File, seleziona il file classes.dex.
  2. Nell'elenco Corso, vai a un corso e selezionalo.
  3. Espandi il corso selezionato.
  4. Attiva/disattiva Mostra campi per mostrare o nascondere i campi del corso.
  5. Attiva/disattiva Mostra metodi per mostrare o nascondere i metodi dei corsi.
  6. Attiva/disattiva Mostra tutti i metodi o i campi di riferimento per mostrare o nascondere pacchetti, classi, metodi e campi di riferimento.

    Nella visualizzazione ad albero, i nodi in corsivo sono riferimenti che non hanno una definizione nel file DEX selezionato. Un file DEX può fare riferimento a metodi e campi definiti in un file diverso. Ad esempio System.out.println() è un riferimento al metodo println() nel framework Android.

Carica mappature ProGuard

Accanto alle icone dei filtri sono presenti le icone di mappatura ProGuard. Le icone ProGuard sono in grigio finché non carichi un insieme di file di mapping ProGuard che aggiungono funzionalità al visualizzatore DEX, ad esempio nomi di deoffuscamento (mapping.txt), mostrando i nodi rimossi (usage.txt) e indicando quelli che non possono essere rimossi (seeds.txt).

Il file di mapping ProGuard importato deve essere derivato dalla stessa build che ha prodotto i file DEX con la riduzione del codice abilitata.

Figura 5. Carica mapping ProGuard...

Per caricare i file di mapping ProGuard, procedi nel seguente modo:

  1. Fai clic su Carica mapping Proguard....
  2. Accedi alla cartella del progetto che contiene i file di mapping e carica tutti i file, qualsiasi combinazione di file o la cartella che contiene i file.

    In genere i file di mapping si trovano in project/app/build/outputs/mappings/release/. Per impostazione predefinita, il selettore file utilizza la cartella release se rileva questa struttura di progetto.

    Innanzitutto, il selettore file controlla se ci sono nomi file che corrispondono esattamente a mapping.txt, seeds.txt e usage.txt. Successivamente, il selettore di file cerca i nomi di file che contengono il testo mapping, usage o seeds da qualche parte e terminano con .txt. Ad esempio, release-seeds-1.10.15.txt è una corrispondenza.

Nell'elenco seguente vengono descritti i file di mappatura:

  • seeds.txt: i nodi che la configurazione ProGuard impedisce di rimuovere durante la riduzione sono mostrati in grassetto.
  • mapping.txt: abilita l'opzione Deoffuscamento dei nomi per consentirti di ripristinare i nomi originali dei nodi che erano offuscati da R8. Ad esempio, puoi ripristinare i nomi dei nodi offuscati come a, b, c in MyClass, MainActivity e myMethod().
  • usage.txt: abilita Mostra nodi rimossi per mostrare le classi, i metodi e i campi che sono stati rimossi da R8 durante la contrazione. I nodi ripristinati sono visualizzati sbarrati.

    Per ulteriori informazioni sull'utilizzo di R8 per offuscare e ridurre al minimo il codice, consulta la pagina Ridurre, offuscare e ottimizzare l'app.

Mostra bytecode, trova gli utilizzi e genera la regola di Keep

I nodi nella visualizzazione elenco Classe hanno un menu contestuale con le seguenti opzioni che consentono di visualizzare il bytecode, trovare gli utilizzi e visualizzare una finestra di dialogo che mostra le regole di ProGuard da copiare e incollare per il nodo selezionato. Fai clic con il pulsante destro del mouse su qualsiasi nodo nella visualizzazione elenco Class per visualizzare il relativo menu contestuale.

Mostra bytecode: decompila la classe, il metodo o il campo selezionato e visualizza la rappresentazione bytecode smali in una finestra di dialogo, come segue:

Figura 6. Bytecode DEX per il metodo init.

Trova utilizzi: mostra quali altre parti del codice DEX fanno riferimento alla classe o al metodo selezionato, come mostrato nella figura 7. Se hai caricato seeds.txt, i nodi visualizzati in grassetto indicano che la configurazione ProGuard ne impedisce la rimozione durante la riduzione:

Figura 7. Riferimenti a MyClass.

Genera regola ProGuard Keep: mostra le regole di ProGuard che puoi copiare e incollare nel file di configurazione ProGuard del progetto, come mostrato nella Figura 8. Ciò impedisce che un determinato pacchetto, classe, metodo o campo venga rimosso durante la fase di riduzione del codice. Per maggiori informazioni, consulta Personalizzare il codice da conservare.

Figura 8. Regole di ProGuard che puoi copiare dalla finestra di dialogo nel file di configurazione ProGuard.

Visualizza entità di codice e risorse

Varie attività di build modificano le entità finali in un'app. Ad esempio, le regole di riduzione di ProGuard possono modificare il codice finale, mentre le risorse immagine possono essere sostituite da risorse in una versione di prodotto.

Per visualizzare la versione finale dei file con lo Strumento di analisi APK, fai clic sull'entità per visualizzare un'anteprima dell'entità di testo o immagine, come mostrato nella figura 9.

Figura 9. Un'anteprima della risorsa immagine finale.

Lo Strumento di analisi APK può inoltre visualizzare vari file di testo e binari. Ad esempio, il visualizzatore delle entità resources.arsc consente di visualizzare i valori specifici della configurazione, come le traduzioni nelle lingue per una risorsa di stringhe. Nella Figura 10 puoi vedere le traduzioni per ogni risorsa di stringa.

Figura 10. Anteprima delle risorse stringa tradotte.

Confronta file

Lo Strumento di analisi APK può confrontare le dimensioni delle entità in due diversi file APK o app bundle. Ciò è utile per capire perché le dimensioni della tua app sono aumentate rispetto a una release precedente.

Prima di pubblicare un'app aggiornata:

  1. Carica nello Strumento di analisi APK la versione dell'app che stai per pubblicare.
  2. Nell'angolo in alto a destra dello Strumento di analisi APK, fai clic su Confronta con l'APK precedente....
  3. Nella finestra di dialogo di selezione, trova l'elemento che è stato pubblicato per l'ultima volta per gli utenti e fai clic su OK.

    Viene visualizzata una finestra di dialogo simile a quella nella Figura 11 per aiutarti a valutare l'impatto che l'aggiornamento potrebbe avere sugli utenti.

La Figura 11 mostra la differenza tra le build di debug e di release di una determinata app. Tra questi tipi di build vengono utilizzate diverse opzioni di build, il che modifica le entità sottostanti in modo diverso.

Figura 11. La differenza tra un APK di debug e di release.