Spesso gli utenti evitano di scaricare app che sembrano troppo grandi, in particolare nei mercati emergenti in cui i dispositivi si connettono a reti 2G e 3G instabili o funzionano con piani con limiti di dati. In questa pagina vengono descritti come ridurre le dimensioni di download dell'app, in modo da consentire a un maggior numero di utenti di scaricarla.
Caricare l'app con Android App Bundle
Carica la tua app come Android App Bundle per ricevere immediatamente salva le dimensioni dell'app quando la pubblichi su Google Play. Android App Bundle è un formato di caricamento che include tutto il codice compilato e le risorse dell'app, ma limita la generazione di APK e l'accesso a Google Play.
Il modello di pubblicazione delle app di Google Play utilizza il tuo app bundle per generare e pubblicare APK ottimizzati per la configurazione del dispositivo di ciascun utente, in modo che scarichi solo il codice e le risorse di cui hanno bisogno la tua app. Non è necessario creare, firmare e gestire diversi APK per supportare dispositivi diversi. e gli utenti ottengono download più piccoli e ottimizzati.
Google Play applica un download compresso limitazione delle dimensioni di 200 MB per le app pubblicate con app bundle. È possibile utilizzare dimensioni maggiori con Play Feature Delivery e Play Asset Delivery, ma l'aumento delle dimensioni dell'app può influire negativamente sul successo delle installazioni e aumentare le disinstallazioni, pertanto ti consigliamo di applicare le linee guida descritte in questa pagina per ridurre al massimo le dimensioni di download dell'app.
Informazioni sulla struttura degli APK
Prima di ridurre le dimensioni dell'app, è utile comprendere la struttura dell'APK di un'app. Un file APK è costituito da un archivio ZIP contenente tutti i file che compongono la tua app. Questi includono file di classe Java, file di risorse e un file contenente risorse compilate.
Un APK contiene le seguenti directory:
META-INF/
: contiene la firmaCERT.SF
eCERT.RSA
oltre al file manifestMANIFEST.MF
.assets/
: contiene gli asset dell'app, che l'app può recuperare utilizzando un oggettoAssetManager
.res/
: contiene risorse che non sono compilateresources.arsc
.lib/
: contiene il codice compilato specifico per il livello software di un di fatturazione. Questa directory contiene una sottodirectory per ogni tipo di piattaforma, ad esempioarmeabi
,armeabi-v7a
,arm64-v8a
,x86
,x86_64
emips
.
Un APK contiene anche i file indicati di seguito. Solo AndroidManifest.xml
è obbligatorio:
resources.arsc
: contiene risorse compilate. Questo file include i contenuti XML da tutte le configurazioni della cartellares/values/
. Lo strumento di pacchettizzazione estrae XML, li compila in formato binario e li archivia. Questi contenuti includono la lingua stringhe e stili, nonché i percorsi di contenuti che non sono inclusi direttamente nelresources.arsc
, ad esempio file di layout e immagini.classes.dex
: contiene le classi compilate nel formato file DEX compreso da la macchina virtuale Dalvik o ART.AndroidManifest.xml
: contiene il file manifest di Android di base. Questo file elenca nome, versione, diritti di accesso e file delle librerie di riferimento dell'app. Il file utilizza il linguaggio di programmazione XML binario.
Riduci il numero e le dimensioni delle risorse
Le dimensioni dell'APK influiscono sulla velocità di caricamento dell'app, sulla quantità di memoria utilizzata e sulla modalità
molta energia consuma. Puoi ridurre le dimensioni dell'APK riducendo il numero e le dimensioni dei file
e le risorse che contiene. In particolare, puoi rimuovere le risorse che la tua app non utilizza più e puoi utilizzare oggetti Drawable
scalabili al posto dei file immagine. Questa sezione illustra questi metodi e altri modi per ridurre le risorse nella tua app al fine di diminuire le dimensioni complessive dell'APK.
Rimuovi le risorse inutilizzate
Lo strumento lint
, un analizzatore di codice statico incluso in Android Studio, rileva le risorse nella cartella res/
a cui non fa riferimento il codice. Quando lo strumento lint
rileva una risorsa potenzialmente inutilizzata
progetto, viene stampato un messaggio come nell'esempio seguente:
res/layout/preferences.xml: Warning: The resource R.layout.preferences appears to be unused [UnusedResources]
Le librerie che aggiungi al codice potrebbero includere risorse inutilizzate. Gradle può eseguire automaticamente
rimuovere le risorse per tuo conto se abiliti
shrinkResources
nel tuo
build.gradle.kts
dell'app.
android { // Other settings. buildTypes { getByName("release") { minifyEnabled = true shrinkResources = true proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro") } } }
android { // Other settings. buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }
Per usare shrinkResources
, attiva la riduzione del codice. Durante il processo di compilazione, R8 rimuove prima il codice inutilizzato. Successivamente, il plug-in Android per Gradle rimuove le risorse non utilizzate.
Per ulteriori informazioni sulla riduzione di codice e risorse e su altri modi in cui Android Studio Dimensioni dell'APK; consulta l'articolo Ridurre, offuscare e ottimizzare l'app.
Nel plug-in Android Gradle 7.0 e versioni successive, puoi dichiarare le configurazioni che la tua app
Google Cloud. Gradle le passa al sistema di compilazione utilizzando il flavor resourceConfigurations
e l'opzione defaultConfig
. Il sistema di compilazione impedisce quindi che le risorse di altre configurazioni non supportate vengano visualizzate nell'APK, riducendone le dimensioni. Per maggiori informazioni
informazioni su questa funzione, vedi
Rimuovi l'alternativa inutilizzata
Google Cloud.
Riduci al minimo l'utilizzo di risorse delle librerie
Quando sviluppi un'app per Android, in genere utilizzi librerie esterne per migliorare il suo usabilità e versatilità. Ad esempio, puoi fare riferimento ad AndroidX per migliorare l'esperienza utente sui dispositivi precedenti oppure utilizzare Google Play Services per recuperare le traduzioni automatiche del testo all'interno della tua app.
Se una libreria è progettata per un server o un computer, può includere molti oggetti e metodi di cui la tua app non ha bisogno. Per includere solo le parti della raccolta necessarie alla tua app, puoi modificare i file della raccolta se la licenza consente la modifica della raccolta. Puoi anche usare un'alternativa, libreria ottimizzata per il mobile per aggiungere funzionalità specifiche alla tua app.
Decodifica di immagini animate native
In Android 12 (livello API 31), l'NDK
L'API ImageDecoder
è espansa per decodificare
tutti i frame e i dati di sincronizzazione delle immagini che utilizzano i formati file GIF animato e WebP animati.
Usa ImageDecoder
al posto delle librerie di terze parti per ulteriore
diminuisci le dimensioni degli APK e trai vantaggio dal futuro
aggiornamenti relativi a sicurezza e prestazioni.
Per maggiori dettagli sull'API ImageDecoder
, consulta API reference
e il sample su GitHub.
Supporta solo densità specifiche
Android supporta diverse densità dello schermo, ad esempio:
ldpi
mdpi
tvdpi
hdpi
xhdpi
xxhdpi
xxxhdpi
Sebbene Android supporti le densità precedenti, non è necessario esportare gli asset rasterizzati in ogni densità.
Se sai che solo una piccola percentuale di utenti ha dispositivi con densità specifiche, valuta se è necessario raggruppare queste densità nell'app. Se non includi risorse per una densità specifica dello schermo, Android scala automaticamente le risorse esistenti progettate in origine, per altre densità dello schermo.
Se la tua app ha bisogno solo di immagini scalate, puoi risparmiare ancora più spazio impostando un'unica variante di
un'immagine in drawable-nodpi/
. Ti consigliamo di includere almeno una xxhdpi
variazione dell'immagine nella tua app.
Per ulteriori informazioni sulle densità dello schermo, vedi Dimensioni e densità dello schermo.
Utilizza oggetti disegnabili
Alcune immagini non richiedono una risorsa immagine statica. Il framework può disegnare dinamicamente l'immagine
in fase di runtime. Drawable
oggetti o <shape>
in
XML: può occupare una piccola quantità di spazio nell'APK. Inoltre, gli oggetti XML Drawable
producono immagini monocromatiche conformi alle linee guida di Material Design.
Riutilizza le risorse
Puoi includere una risorsa separata per le varianti di un'immagine, ad esempio versioni colorate, ombreggiate o ruotate della stessa immagine. Tuttavia, ti consigliamo di riutilizzare lo stesso insieme di risorse e di personalizzarle in base alle esigenze in fase di esecuzione.
Android fornisce diverse utilità per modificare il colore di una risorsa utilizzando gli attributi android:tint
e tintMode
.
Puoi anche omettere le risorse che rappresentano solo l'equivalente ruotato di un'altra risorsa. Le seguenti Lo snippet di codice fornisce un esempio di "mi piace" in un "non mi piace" ruotando verso centrale dell'immagine e ruotandola di 180 gradi:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:drawable="@drawable/ic_thumb_up" android:pivotX="50%" android:pivotY="50%" android:fromDegrees="180" />
Rendering dal codice
Puoi anche ridurre le dimensioni dell'APK eseguendo il rendering procedurale delle immagini. Rendering procedurale libera spazio perché non memorizzi più un file immagine nell'APK.
File PNG Crunch
Lo strumento aapt
può ottimizzare le risorse immagine posizionate in res/drawable/
con la compressione senza perdita di dati durante il processo di compilazione. Ad esempio, lo strumento aapt
può
converti un PNG a colori reali che non richiede più di 256 colori in un PNG a 8 bit con un colore
tavolozza. In questo modo l'immagine avrà la stessa qualità, ma l'utilizzo di memoria ridotta.
aapt
presenta le seguenti limitazioni:
- Lo strumento
aapt
non riduce le dimensioni dei file PNG contenuti nella cartellaasset/
. - I file immagine devono utilizzare al massimo 256 colori affinché lo strumento
aapt
sia ottimizzato che li rappresentano. - Lo strumento
aapt
potrebbe gonfiare i file PNG già compressi. Per evitare Puoi utilizzare il flagisCrunchPngs
per disattivare questa procedura per i file PNG:
Comprimi file PNG e JPEG
Puoi ridurre le dimensioni dei file PNG senza ridurne la qualità utilizzando strumenti come pngcrush, pngquant, oppure zopflipng. Tutti questi strumenti è possibile ridurre le dimensioni del file PNG mantenendo la qualità percettiva dell'immagine.
Lo strumento pngcrush
è particolarmente efficace. Questo strumento esegue l'iterazione sui filtri PNG e sui parametri zlib (Deflate), utilizzando ogni combinazione di filtri e parametri per comprimere l'immagine.
Sceglie quindi la configurazione che restituisce l'output compresso più piccolo.
Per comprimere i file JPEG, puoi utilizzare strumenti come packJPG e guetzli.
Utilizza il formato file WebP
Anziché utilizzare i file PNG o JPEG, puoi utilizzare anche WebP per le tue immagini. Il formato WebP offre trasparenza e compressione con perdita di dati, come JPG e PNG, e può offrire una compressione migliore rispetto a JPEG o PNG.
Puoi convertire immagini BMP, JPG, PNG o GIF statiche esistenti in formato WebP utilizzando Android Studio. Per maggiori informazioni, vedi Creare immagini WebP.
Utilizza grafica vettoriale
Puoi utilizzare le immagini vettoriali per creare icone indipendenti dalla risoluzione e altri contenuti multimediali scalabili.
Puoi usare queste immagini per ridurre notevolmente l'ingombro dell'APK. Le immagini vettoriali sono rappresentate in Android come oggetti VectorDrawable
. Con un oggetto VectorDrawable
, un file da 100 byte può generare un'immagine nitida
dimensioni dello schermo.
Tuttavia, il sistema impiega molto più tempo per eseguire il rendering
VectorDrawable
oggetto e le immagini più grandi richiedono ancora più tempo per essere visualizzate sullo schermo.
Pertanto, ti consigliamo di utilizzare queste immagini vettoriali solo per la visualizzazione di immagini di piccole dimensioni.
Per ulteriori informazioni sull'utilizzo degli oggetti VectorDrawable
, consulta
Drawables.
Utilizzare grafiche vettoriali per le immagini animate
Non utilizzare
AnimationDrawable
per creare animazioni fotogramma per fotogramma, perché per farlo è necessario includere una bitmap separata
per ogni frame dell'animazione, aumentando drasticamente le dimensioni dell'APK.
Utilizza invece
AnimatedVectorDrawableCompat
per creare
vettore animato
drawables.
Riduci il codice nativo e Java
Puoi utilizzare i seguenti metodi per ridurre le dimensioni del codebase Java e nativo nel tuo dell'app.
Rimuovi il codice generato non necessario
Assicurati di comprendere l'impronta di qualsiasi codice generato automaticamente. Ad esempio, molti strumenti di buffer del protocollo generano un numero eccessivo di metodi e classi, il che può raddoppiare o triplicare le dimensioni dell'app.
Evita le enumerazioni
Una singola enum può aggiungere circa 1,0-1,4 kB al file classes.dex
dell'app. Queste aggiunte possono accumularsi rapidamente per sistemi complessi o librerie condivise. Se possibile, prendi in considerazione
utilizzando l'annotazione @IntDef
e la contrazione del codice
per eliminare le enumerazioni e convertirle in numeri interi. Questa conversione di tipo preserva tutti i vantaggi di sicurezza del tipo degli enum.
Riduci le dimensioni dei file binari nativi
Se la tua app utilizza codice nativo e Android NDK, puoi anche ridurre le dimensioni della versione di release dell'app ottimizzando il codice. Due tecniche utili sono la rimozione dei simboli di debug e senza estrarre librerie native.
Rimuovere i simboli di debug
L'utilizzo dei simboli di debug è utile se la tua app è in fase di sviluppo e richiede ancora il debug. Utilizza le funzionalità di
lo strumento arm-eabi-strip
fornito nell'NDK di Android per rimuovere il debug non necessario
da librerie native. Successivamente, puoi compilare la build della release.
Evitare di estrarre le librerie native
Quando crei la versione release della tua app, includi i file .so
non compressi nell'APK impostando useLegacyPackaging
su false
nel file build.gradle.kts
dell'app. La disattivazione di questo flag impedisce a PackageManager
di copiare i file .so
dall'APK al file system durante l'installazione. Questo metodo rende
più piccoli dell'app.
Mantieni APK snelli
L'APK potrebbe contenere contenuti che gli utenti scaricano, ma non utilizzano mai, come risorse linguistiche aggiuntive o per la densità dello schermo. Per garantire un download minimo per gli utenti, carica l'app su Google Play utilizzando Android App Bundle. Il caricamento degli app bundle consente a Google Play di generare e pubblicare APK ottimizzati per la configurazione del dispositivo di ogni utente, in modo che scarichi solo il codice e le risorse necessarie per eseguire la tua app. Non devi creare, firmare e gestire più APK per supportare dispositivi diversi e gli utenti ottengono download più piccoli e ottimizzati.
Se non pubblichi la tua app su Google Play, puoi segmentarla in diversi APK, differenziate per fattori come le dimensioni dello schermo o il supporto delle texture GPU.
Quando un utente scarica la tua app, il suo dispositivo riceve l'APK corretto in base alle sue funzionalità e impostazioni. In questo modo, i dispositivi non ricevono asset per funzionalità che non hanno. Ad esempio, se un utente ha un dispositivo hdpi
, non ha bisogno di xxxhdpi
che potresti includere per i dispositivi con display ad alta densità.
Per ulteriori informazioni, consulta la sezione Creare APK e supporto di più APK.