Utilizzo memoria bitmap

Le bitmap sono spesso gli oggetti che consumano più memoria in un'app. Le operazioni di decodifica e scalabilità si trovano spesso nel percorso critico per il rendering dei frame. L'ottimizzazione dell'utilizzo della memoria bitmap migliora notevolmente la reattività dell'interfaccia utente, la durata della batteria e la stabilità complessiva riducendo i problemi di jank, ANR e interruzioni dei processi correlate a errori di memoria insufficiente.

Fattori che contribuiscono all'utilizzo elevato della memoria bitmap

Nel calcolo potrebbe essere inclusa anche la memoria virtuale mai utilizzata. Se noti un utilizzo della memoria bitmap insolitamente 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 controllare 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 di perdite di memoria con LeakCanary

Integra la libreria LeakCanary per automatizzare il rilevamento di perdite di memoria nella tua app. LeakCanary fornisce un'analisi automatica dell'heap, identificando gli oggetti che avrebbero dovuto essere raccolti come spazzatura, ma che sono ancora conservati in memoria, come le bitmap conservate dai componenti distrutti.

Documentazione sulle prestazioni delle bitmap

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

Elenco di controllo per sviluppatori per l'ottimizzazione della memoria utilizzata dalle bitmap

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

  • Riduci: riduce il footprint della memoria iniziale durante il caricamento o la visualizzazione di bitmap.
  • Riutilizzo: implementa meccanismi di memorizzazione nella cache per evitare allocazioni bitmap ridondanti.
  • Ricicla: 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.

Principio fondamentale Area Descrizione
Riduci 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 i thread, la memorizzazione nella cache e la decodifica efficiente.
Implementare il sottocampionamento Decodifica le immagini in modo che corrispondano alle dimensioni del contenitore dell'interfaccia utente di destinazione anziché caricare asset a risoluzione completa.
Utilizza RGB_565 per le immagini opache Riduzione del footprint della memoria del 50% grazie al passaggio da ARGB_8888 a una configurazione a 16 bit per le immagini senza trasparenza.
Dai la priorità ai VectorDrawable Utilizza vettori per icone e grafica di base per garantire una scalabilità nitida con un overhead di memoria minimo.
Ottimizzare la pubblicazione delle immagini lato server Configura le API di backend per pubblicare immagini personalizzate in base alla densità del dispositivo e alle dimensioni del contenitore dell'interfaccia utente.
Eliminare i margini trasparenti Evita di allocare memoria per i pixel "invisibili" utilizzando InsetDrawable o la spaziatura interna del layout anziché i margini incorporati. Consulta Engineering memory-performant Android apps.
Riutilizza Configurare le dimensioni ottimali della cache Personalizza i limiti della cache di memoria e della cache del disco in base alla RAM e alla risoluzione dello schermo del dispositivo. Consulta Memorizzazione nella cache delle bitmap.
Riciclo Eliminare le risorse in background Implementa TRIM_MEMORY_BACKGROUND per svuotare le cache e migliorare la sopravvivenza dei processi durante la pressione della memoria di sistema.
Rilasciare gli asset quando l'interfaccia utente è nascosta Utilizza TRIM_MEMORY_UI_HIDDEN per rilasciare le cache bitmap quando l'app non è più visibile all'utente.
Monitora le perdite di memoria Utilizza LeakCanary e Memory Profiler per trovare le bitmap conservate dopo l'eliminazione del relativo LifecycleOwner. Fai riferimento a Gestire la memoria dell'app.