Bitmaps sind oft die Objekte, die in einer App am meisten Arbeitsspeicher verbrauchen. Decodierungs- und Skalierungsvorgänge befinden sich häufig auf dem kritischen Pfad für das Frame-Rendering. Durch die Optimierung der Arbeitsspeichernutzung für Bitmaps werden die Reaktionsfähigkeit der Benutzeroberfläche, die Akkulaufzeit und die allgemeine Stabilität erheblich verbessert, da Verzögerungen, ANRs und prozessbedingte OOM-Abbrüche reduziert werden.
Hohe Arbeitsspeichernutzung für Bitmaps erkennen
Android Vitals bietet Messwerte zum Speicherbedarf für Bitmaps einer App, indem Daten von Android-Geräten aggregiert werden. Diese Messwerte umfassen periodenbasierte Perzentile (z. B. 28 Tage) pro Paket und Prozess. Anhand dieser Daten lassen sich Trends und potenzielle Regressionen bei der Arbeitsspeichereffizienz auf verschiedenen Gerätetypen und in verschiedenen Versionen erkennen.
In Android Vitals wird die Arbeitsspeichernutzung für Bitmaps Ihrer App nach den folgenden Prozessstatus aufgeschlüsselt:
- Vordergrund: Der Prozess der App ist sichtbar. Es ist zu erwarten, dass das P99 im Vordergrund deutlich höher ist als in anderen Prozessstatus.Entwickler sollten jedoch untersuchen, ob das Verhältnis von P99 zu P50 erheblich ist (z. B.höher als 3,5), da dies oft auf ein Speicherleck bei Bitmaps hinweist. Sie können dies erkennen, indem Sie nach einer Abweichung zwischen der typischen Nutzung (P50) und der Nutzung von Ausreißern (P99) suchen. Während eine allgemeine Asset-Überlastung den Arbeitsspeicher gleichmäßig über alle Perzentile hinweg erhöht, summieren sich Speicherlecks im Laufe der Zeit und verzerren die Daten am Ende (P99) stark. Achten Sie darauf, dass Bitmap-Zuweisungen im Vordergrund nicht unnötig bestehen bleiben, nachdem die App in andere Status übergegangen ist.
- Vom Nutzer wahrgenommene Dienste: Der Prozess der App wird in einem wahrnehmbaren Status ausgeführt. Dazu gehören Vordergrunddienste, beschleunigte Jobs und vom Nutzer initiierte Datenübertragungsjobs. Apps dürfen bei der Umstellung auf diese Status keine großen Bitmap-Zuweisungen im Vordergrund beibehalten. Da diese Dienste für lang andauernde Aufgaben konzipiert sind, beeinträchtigt das Beibehalten großer Assets die allgemeine Nutzererfahrung und zwingt den Low Memory Killer Daemon (LMKD), Arbeitsspeicher freizugeben, indem Prozesse mit niedrigerer Priorität beendet werden.
- Hintergrund: Die App führt einen Hintergrunddienst aus oder wurde kürzlich in den Hintergrund verschoben, ist aber noch nicht im Cache. Da dieser Prozessstatus weniger wichtig ist als Vordergrund- oder wahrnehmbare Prozesse, sollten Apps hier explizit große Bitmap-Assets freigeben, um den Arbeitsspeicher zu entlasten.
- Im Cache: Die App befindet sich im Cache. Dieser Status ist sehr anfällig für Arbeitsspeicherprobleme des Systems wie LMKs. Apps müssen in diesem Status proaktiv die Arbeitsspeichernutzung für Bitmaps reduzieren, um zu vermeiden, dass sie vom Betriebssystem entfernt werden.
Faktoren, die zu einer hohen Arbeitsspeichernutzung für Bitmaps beitragen
Auch virtueller Arbeitsspeicher, der nie verwendet wurde, kann in die Berechnung einbezogen werden. Wenn Sie eine unerwartet hohe Arbeitsspeichernutzung für Bitmaps feststellen, prüfen Sie, ob Sie Arbeitsspeicher zuweisen, der nicht verwendet wird.
Ressourcen
Bitmaps in Android Studio analysieren
Android Studio-Profiling für Bitmaps
Mit dem Speicher-Profiler können Sie Arbeitsspeicherzuweisungen in Echtzeit prüfen, Heap-Dumps erfassen und Objekte auf Speicherlecks analysieren. Außerdem können Sie mit dem Heap Analyzer Speicherlecks erkennen, doppelte Bitmap-Zuweisungen identifizieren und die Objektbeibehaltung visualisieren.
Automatisierte Speicherleckerkennung mit LeakCanary
Binden Sie die LeakCanary-Bibliothek ein, um die Erkennung von Speicherlecks in Ihrer App zu automatisieren. LeakCanary bietet eine automatische Heap-Analyse, bei der Objekte identifiziert werden, die eigentlich garbage-collected werden sollten, aber noch im Arbeitsspeicher gehalten werden, z. B. Bitmaps, die von gelöschten Aktivitäten oder Fragmenten beibehalten werden.
Dokumentation zur Bitmap-Leistung
Diese Ressourcen bieten umfassende Anleitungen zu Best Practices für die effiziente Bitmap-Verarbeitung in verschiedenen Android-Komponenten.
Checkliste für Entwickler zur Optimierung der Arbeitsspeichernutzung für Bitmaps
Um die Arbeitsspeichereffizienz für Bitmaps zu optimieren, sollten Sie die drei Grundprinzipien befolgen: reduzieren, wiederverwenden und recyceln.
- Reduzieren: Minimieren Sie den anfänglichen Speicherbedarf beim Laden oder Anzeigen von Bitmaps.
- Wiederverwenden: Implementieren Sie Caching-Mechanismen, um redundante Bitmap Zuweisungen zu vermeiden.
- Recyceln: Geben Sie Ressourcen proaktiv frei, um die Neuzuweisung von Arbeitsspeicher für aktive Prozesse zu ermöglichen.
Die folgende Checkliste für Entwickler kann Ihnen helfen, die Arbeitsspeichernutzung für Bitmaps zu optimieren.
| Grundprinzip | Region | Beschreibung |
|---|---|---|
| Reduzieren | Doppelte Bitmaps entfernen | Analysieren Sie Heap-Dumps mit dem Speicher-Profiler, um redundante Bitmap-Zuweisungen zu erkennen. Weitere Informationen finden Sie im Leitfaden Bitmap-Arbeitsspeicher verwalten. |
| Bibliotheken zum Laden von Bildern nutzen | Verwenden Sie Bibliotheken wie Glide und Coil, um Threading, Caching und effiziente Decodierung zu automatisieren. | |
| Downsampling implementieren | Decodieren Sie Bilder so, dass sie den Abmessungen des Ziel-UI-Containers entsprechen, anstatt Assets in voller Auflösung zu laden. | |
| RGB_565 für undurchsichtige Bilder verwenden | Reduzieren Sie den Speicherbedarf um 50 %, indem Sie von ARGB_8888 zu einer 16-Bit-Konfiguration für Bilder ohne Transparenz wechseln. |
|
| VectorDrawables priorisieren | Verwenden Sie Vektoren für Symbole und einfache Grafiken, um eine scharfe Skalierung mit minimalem Arbeitsspeicheraufwand zu gewährleisten. | |
| Serverseitige Bildübermittlung optimieren | Konfigurieren Sie Back-End-APIs so, dass Bilder entsprechend der Gerätedichte und den ImageView-Abmessungen bereitgestellt werden. | |
| Transparente Ränder entfernen | Vermeiden Sie die Zuweisung von Arbeitsspeicher für „unsichtbare“ Pixel, indem Sie InsetDrawable oder Layout-Padding anstelle von fest codierten Rändern verwenden. Weitere Informationen finden Sie unter Arbeitsspeichereffiziente Android-Apps entwickeln. | |
| Wiederverwenden | Optimale Cache-Größen konfigurieren | Passen Sie die Arbeitsspeicher- und Datenträger-Cache-Limits an den RAM und die Bildschirmauflösung des Geräts an. Weitere Informationen finden Sie unter Bitmaps im Cache speichern. |
| Recyceln | Ressourcen im Hintergrund löschen | Implementieren Sie TRIM_MEMORY_BACKGROUND, um Caches zu leeren und die Überlebensfähigkeit von Prozessen bei Arbeitsspeicherproblemen des Systems zu verbessern. |
| Assets freigeben, wenn die Benutzeroberfläche ausgeblendet ist | Verwenden Sie TRIM_MEMORY_UI_HIDDEN, um Bitmap-Caches freizugeben, wenn die App für den Nutzer nicht mehr sichtbar ist. |
|
| Auf Speicherlecks prüfen | Verwenden Sie LeakCanary und Speicher-Profiler, um Bitmaps zu finden, die beibehalten werden, nachdem ihr LifecycleOwner gelöscht wurde. Weitere Informationen finden Sie unter Arbeitsspeicher der App verwalten. |