Utilizzo memoria bitmap

Le bitmap sono spesso gli oggetti che consumano più memoria in un'app. Le operazioni di decodifica e scalabilità sono spesso nel percorso critico per il rendering dei frame. L'ottimizzazione dell'utilizzo della memoria bitmap offre miglioramenti significativi nella reattività dell'UI, nella durata della batteria e nella stabilità complessiva riducendo jank, ANR e interruzioni dei processi correlate a OOM.

Identificare un utilizzo elevato della memoria utilizzata per le bitmap

Android vitals fornisce metriche sul footprint della memoria bitmap di un'app aggregando i dati dei dispositivi Android. Queste metriche includono percentili basati sul periodo (ad es. 28 giorni) per pacchetto e processo. Questi dati aiutano a identificare tendenze e potenziali regressioni nell'efficienza della memoria su diversi tipi e versioni di dispositivi.

Android vitals condivide la memoria utilizzata della tua app per bitmap suddivisa in base ai seguenti stati del processo:

  • In primo piano: il processo dell'app è visibile. È previsto che il P99 sia significativamente più alto in primo piano rispetto ad altri stati del processo, ma gli sviluppatori devono verificare se il rapporto P99/P50 è significativo (ad es. superiore a 3,5 volte), in quanto spesso indica una perdita di memoria bitmap. Puoi identificarlo cercando una divergenza tra l'utilizzo tipico (P50) e l'utilizzo anomalo (P99). Mentre il bloat degli asset generali aumenta la memoria in modo uniforme in tutti i percentili, le perdite di memoria si accumulano nel tempo, distorcendo notevolmente i dati di coda (P99). Assicurati che le allocazioni di bitmap in primo piano non persistano inutilmente dopo che l'app passa ad altri stati.
  • Servizi percepiti dall'utente: il processo dell'app è in esecuzione in uno stato percepibile. Sono inclusi i servizi in primo piano, i job accelerati e i job di trasferimento dei dati avviati dall'utente. Le app non devono conservare allocazioni di bitmap in primo piano pesanti quando passano a questi stati. Poiché questi servizi sono progettati per attività a lunga esecuzione, la conservazione di asset di grandi dimensioni peggiora l'esperienza utente complessiva e costringe il daemon Low Memory Killer (LMKD) a recuperare la memoria terminando i processi a priorità inferiore.
  • In background: l'app sta eseguendo un servizio in background o è stata recentemente messa in background, ma non è ancora memorizzata nella cache. Poiché questo stato del processo è meno importante dei processi in primo piano o percepibili, le app devono rilasciare esplicitamente gli asset bitmap di grandi dimensioni per ridurre la pressione sulla memoria.
  • Memorizzata nella cache: l'app è in uno stato di cache. Questo stato è molto sensibile alla pressione sulla memoria di sistema, ad esempio LMK. Le app devono ridurre in modo proattivo l'utilizzo della memoria bitmap in questo stato per evitare l'eliminazione da parte del sistema operativo.

Fattori che contribuiscono a un utilizzo elevato della memoria bitmap

Nel calcolo potrebbe essere inclusa anche la memoria virtuale mai utilizzata. Se noti un utilizzo della memoria bitmap inaspettatamente elevato, verifica di non allocare memoria inutilizzata.

Risorse

Analizzare le bitmap in Android Studio

Profilazione di Android Studio per le bitmap

Utilizza Memory Profiler per ispezionare le allocazioni di memoria in tempo reale, acquisire dump dell'heap e analizzare gli oggetti per rilevare perdite di memoria. Inoltre, utilizza l'analizzatore dell'heap per rilevare perdite di memoria, identificare allocazioni di bitmap duplicate e visualizzare la conservazione degli oggetti.

Rilevamento automatico delle perdite con LeakCanary

Integra la libreria LeakCanary per automatizzare il rilevamento delle perdite di memoria nella tua app. LeakCanary fornisce un'analisi automatica dell'heap, identificando gli oggetti che avrebbero dovuto essere sottoposti a garbage collection ma che sono ancora conservati in memoria, ad esempio le bitmap conservate da attività o frammenti eliminati.

Documentazione sulle prestazioni delle bitmap

Queste risorse forniscono indicazioni complete sulle best practice per la gestione efficiente delle bitmap in diversi componenti Android.

Elenco di controllo per gli sviluppatori per l'ottimizzazione dell'utilizzo della memoria bitmap

Per ottimizzare l'efficienza della memoria bitmap, segui i tre principi fondamentali: ridurre, riutilizzare e riciclare.

  • Ridurre: riduci al minimo il footprint della memoria iniziale durante il caricamento o la visualizzazione delle bitmap.
  • Riutilizzare: implementa meccanismi di memorizzazione nella cache per evitare allocazioni di bitmap ridondanti.
  • Riciclare: rilascia in modo proattivo le risorse per consentire la riallocazione della memoria per i processi attivi.

Il seguente elenco di controllo per gli sviluppatori può aiutarti a ottimizzare l'utilizzo della memoria bitmap.

Principi fondamentali Area Descrizione
Riduzione Eliminare le bitmap duplicate Analizza i dump dell'heap utilizzando Memory Profiler per rilevare allocazioni di bitmap ridondanti. Consulta la guida Gestire la memoria bitmap.
Sfruttare le librerie di caricamento delle immagini Utilizza librerie come Glide e Coil per automatizzare il threading, la memorizzazione nella cache e la decodifica efficiente.
Implementare il downsampling Decodifica le immagini in modo che corrispondano alle dimensioni del contenitore dell'UI di destinazione anziché caricare asset a risoluzione completa.
Utilizzare RGB_565 per le immagini opache Riduci l'impronta di memoria del 50% passando da ARGB_8888 a una configurazione a 16 bit per le immagini senza trasparenza.
Assegnare la priorità a VectorDrawable Utilizza i vettori per le icone e la grafica di base per garantire una scalabilità nitida con un overhead di memoria minimo.
Ottimizzare il caricamento delle immagini lato server Configura le API di backend per erogare immagini personalizzate in base alla densità del dispositivo e alle dimensioni di ImageView.
Eliminare i margini trasparenti Evita di allocare memoria per i pixel "invisibili" utilizzando InsetDrawable o il padding del layout anziché i margini integrati. Consulta la pagina Creare app Android con prestazioni di memoria elevate.
Riutilizzo Configurare le dimensioni ottimali della cache Personalizza i limiti della cache di memoria e della cache del disco in base alla RAM del dispositivo e alla risoluzione dello schermo. Consulta la pagina Memorizzare le bitmap nella cache.
Riciclo Eliminare le risorse in background Implementa TRIM_MEMORY_BACKGROUND per cancellare le cache e migliorare la sopravvivenza dei processi durante la pressione sulla memoria di sistema.
Rilasciare gli asset quando l'UI è nascosta Utilizza TRIM_MEMORY_UI_HIDDEN per rilasciare le cache di bitmap quando l'app non è più visibile all'utente.
Monitorare le perdite di memoria Utilizza LeakCanary e Memory Profiler per trovare le bitmap conservate dopo l'eliminazione di LifecycleOwner. Consulta la pagina Gestire la memoria dell'app.