Bitmaps sind oft die speicherintensivsten Objekte in einer App. Decodierungs- und Skalierungsvorgänge befinden sich häufig auf dem kritischen Pfad für das Rendern von Frames. Durch die Optimierung der Bitmap-Arbeitsspeichernutzung lassen sich die Reaktionsfähigkeit der Benutzeroberfläche, die Akkulaufzeit und die allgemeine Stabilität deutlich verbessern, da Verzögerungen, ANRs und OOM-bedingte Prozessbeendigungen reduziert werden.
Faktoren für eine hohe Arbeitsspeichernutzung für Bitmaps
Auch virtueller Speicher, der nie verwendet wurde, kann in die Berechnung einbezogen werden. Wenn Sie eine unerwartet hohe Bitmap-Arbeitsspeichernutzung 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.
Automatische 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 und identifiziert Objekte, die eigentlich durch Garbage Collection entfernt werden sollten, aber weiterhin im Speicher gehalten werden, z. B. Bitmaps, die von zerstörten Komponenten 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 Bitmap-Arbeitsspeichernutzung
Um die Arbeitsspeichereffizienz von Bitmaps zu optimieren, sollten Sie die drei Grundsätze „Reduzieren“, „Wiederverwenden“ und „Wiederaufbereiten“ beachten.
- Reduzieren: Minimieren Sie den anfänglichen Speicherbedarf beim Laden oder Anzeigen von Bitmaps.
- Wiederverwendung: Implementieren Sie Caching-Mechanismen, um redundante Bitmap-Zuweisungen zu vermeiden.
- Wiederverwenden: Ressourcen proaktiv freigeben, damit der Arbeitsspeicher für aktive Prozesse neu zugewiesen werden kann.
Die folgende Checkliste für Entwickler kann Ihnen helfen, die Arbeitsspeichernutzung von Bitmaps zu optimieren.
| Grundprinzip | Region | Beschreibung |
|---|---|---|
| Einschränken | 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 effizientes Decodieren zu automatisieren. | |
| Downsampling implementieren | Bilder dekodieren, damit 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 für Bilder ohne Transparenz von ARGB_8888 auf eine 16-Bit-Konfiguration umstellen. |
|
| VectorDrawables priorisieren | Verwenden Sie Vektoren für Symbole und einfache Grafiken, um eine scharfe Skalierung mit minimalem Speicherbedarf zu gewährleisten. | |
| Serverseitige Bildübermittlung optimieren | Konfigurieren Sie Backend-APIs, um Bilder bereitzustellen, die auf die Gerätedichte und die Abmessungen des UI-Containers zugeschnitten sind. | |
| Transparente Ränder entfernen | Vermeiden Sie die Zuweisung von Arbeitsspeicher für „unsichtbare“ Pixel, indem Sie InsetDrawable oder Layout-Padding anstelle von integrierten Rändern verwenden. Weitere Informationen finden Sie unter Speichereffiziente Android-Apps entwickeln. | |
| Wiederverwenden | Optimale Cache-Größen konfigurieren | Passen Sie die Grenzwerte für Arbeitsspeicher und Datenträger-Cache an den RAM und die Bildschirmauflösung des Geräts an. Weitere Informationen finden Sie unter Bitmaps im Cache speichern. |
| Recyceln | Ressourcen im Hintergrund dauerhaft löschen | TRIM_MEMORY_BACKGROUND implementieren, um Caches zu leeren und die Überlebensfähigkeit von Prozessen bei hohem Systemarbeitsspeicher zu verbessern. |
| Infos zur Veröffentlichung, 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 | Mit LeakCanary und Speicher-Profiler können Sie Bitmaps finden, die nach dem Zerstören des LifecycleOwner beibehalten werden. Weitere Informationen finden Sie unter Arbeitsspeicher der App verwalten. |