Ridurre le dimensioni dell'app

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 firma CERT.SF e CERT.RSA oltre al file manifest MANIFEST.MF.
  • assets/: contiene gli asset dell'app, che l'app può recuperare utilizzando un AssetManager .
  • res/: contiene risorse che non sono compilate resources.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 esempio armeabi, armeabi-v7a, arm64-v8a e x86 x86_64 e mips.

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 cartella res/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 nel resources.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 in asset/ .
  • 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 flag isCrunchPngs 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.