Gli utenti spesso 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 utilizzano 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. Dimensioni maggiori sono possibili utilizzando Play Feature Delivery e Play Asset Delivery, ma l'aumento delle dimensioni dell'app può influire negativamente sul successo delle installazioni e aumentare il numero di disinstallazioni, pertanto ti consigliamo di applicare linee guida descritte in questa pagina per ridurre il più possibile le dimensioni di download dell'app.
Informazioni sulla struttura degli APK
Prima di ridurre le dimensioni dell'app, è utile comprendere la struttura del suo APK. 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 unAssetManager
.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
ex86
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 Android principale. 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
le risorse che contiene. In particolare, puoi rimuovere le risorse che la tua app non usa più
possono usare gli strumenti
Drawable
oggetti in
dei file immagine. Questa sezione illustra questi metodi e altri modi per ridurre
risorse nella tua app per ridurre le dimensioni complessive dell'APK.
Rimuovi le risorse inutilizzate
Lo strumento lint
, un analizzatore statico di codice
inclusa in Android Studio: rileva le risorse nella cartella res/
che il codice
non fa riferimento. Quando lo strumento lint
rileva una risorsa potenzialmente inutilizzata nel tuo
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.
Kotlin
android { // Other settings. buildTypes { getByName("release") { minifyEnabled = true shrinkResources = true proguardFiles(getDefaultProguardFile('proguard-android.txt'), "proguard-rules.pro") } } }
Alla moda
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 il codice inutilizzato. Quindi, il plug-in Android per Gradle rimuove le risorse inutilizzate.
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 passa queste informazioni al sistema di compilazione utilizzando
resourceConfigurations
sapore e l'opzione defaultConfig
. Il sistema di compilazione impedisce quindi alle risorse
altre configurazioni non supportate non vengono mostrate nell'APK, il che riduce le dimensioni dell'APK. Per ulteriori 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, potresti fare riferimento ad AndroidX per migliorare l'esperienza utente sui dispositivi precedenti oppure puoi usare Google Play Services per recuperare traduzioni automatiche del testo all'interno dell'app.
Se una libreria è progettata per un server o un desktop, può includere molti oggetti e metodi che non serve alla tua app. 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 ulteriori dettagli sull'API ImageDecoder
, consulta le
API reference
e
esempio
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 i file asset a 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 un xxhdpi
una variante dell'immagine nell'app.
Per ulteriori informazioni sulle densità dello schermo, vedi Dimensioni e densità dello schermo.
Utilizza oggetti disegnabili
Alcune immagini non richiedono una risorsa di immagini statiche. 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, il codice 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 colorata, ombreggiata delle versioni ruotate della stessa immagine. Tuttavia, ti consigliamo di riutilizzare lo stesso insieme di risorse e personalizzarli in base alle esigenze in fase di runtime.
Android offre diverse utilità per modificare il colore di un asset, utilizzando
Attributi android:tint
e tintMode
.
Puoi anche omettere le risorse che sono 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/
e 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
. 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 i file PNG contenuti inasset/
. - 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:
Kotlin
buildTypes.all { isCrunchPngs = false }
Alla moda
buildTypes.all { isCrunchPngs = false }
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
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. WebP fornisce compressione e trasparenza con perdita di dati, ad esempio JPG e PNG, e può fornire una migliore una compressione più alta 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 grafiche vettoriali per creare icone che non dipendono dalla risoluzione e altri elementi multimediali scalabili.
Puoi usare queste immagini per ridurre notevolmente l'utilizzo degli APK. Le immagini vettoriali sono rappresentate in
Android come
VectorDrawable
di oggetti strutturati. 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, valuta la possibilità di utilizzare queste grafiche vettoriali solo in caso di immagini di piccole dimensioni.
Per ulteriori informazioni sull'utilizzo degli oggetti VectorDrawable
, consulta
Drawable (Disegnabili).
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 la dimensione di qualsiasi codice generato automaticamente. Ad esempio: molti strumenti di buffer di protocollo generano un numero eccessivo di metodi e classi, che può raddoppiare triplicare le dimensioni della tua app.
Evita enumerazioni
Una singola enum può aggiungere circa 1,0-1,4 kB al file classes.dex
dell'app. Questi
le 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. Questo tipo di conversione conserva tutte le
dei tipi di vantaggi delle enum in materia di sicurezza.
Riduci le dimensioni dei file binari nativi
Se la tua app utilizza codice nativo e Android NDK, puoi anche ridurre le dimensioni della release della tua 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 ha senso se la tua app è in fase di sviluppo e deve ancora essere sottoposta a 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.
Evita di estrarre le librerie native
Quando crei la versione di release dell'app, pacchettizza i file .so
non compressi nella
APK per impostazione
useLegacyPackaging
a false
nel file build.gradle.kts
dell'app. La disattivazione di questo flag impedisce
PackageManager
da
copia di .so
file dall'APK al file system durante l'installazione. Questo metodo rende
più piccoli dell'app.
Mantieni APK snelli
L'APK potrebbe includere contenuti che gli utenti scaricano ma che non utilizzano mai, ad esempio linguaggio aggiuntivo 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 di app bundle consente a Google Play genera e pubblica APK ottimizzati per la configurazione del dispositivo di ciascun utente in modo che vengano scaricati solo il codice e le risorse di cui hanno bisogno per eseguire l'app. Non è necessario creare, firmare e gestire più APK per supportare dispositivi diversi e gli utenti ricevono download di dimensioni inferiori e più ottimizzati.
Se non pubblichi la tua app su Google Play, puoi segmentarla in diversi APK, differenziate per fattori quali 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 alla sua
funzionalità e impostazioni. In questo modo, i dispositivi non ricevono asset per le funzionalità che non ricevono
avere. 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.