Ich bin sehr gespannt auf diese Frage zur Speicherverwaltung des Android-Betriebssystems und hoffe auf eine recht ausführliche Antwort zu diesem Thema.
Was ich gerne wissen würde:
- Was ist die maximale Speichermenge (in Megabyte / als Prozentsatz des gesamten Arbeitsspeichers), die eine Android-Anwendung (die keine System-App ist) verwenden kann?
- Gibt es Unterschiede zwischen Android-Versionen ?
- Gibt es Unterschiede hinsichtlich des Herstellers des Geräts?
Und am wichtigsten:
- Was wird berücksichtigt / wovon hängt es ab, wenn das System bestimmt, wie viel RAM eine App zur Laufzeit verwenden kann (vorausgesetzt, das maximale Speicher pro App ist keine statische Zahl)?
Was ich bisher gehört habe (bis 2013):
- Frühe Android-Geräte hatten eine App-Obergrenze von 16 MB
- Später erhöhte sich diese Obergrenze auf 24 MB oder 32 MB
Was mich sehr neugierig macht:
Beide Grenzwerte sind sehr niedrig.
Ich habe kürzlich den Android Task Manager heruntergeladen , um den RAM meines Geräts zu überprüfen. Was mir aufgefallen ist, ist, dass es Anwendungen gibt, die etwa 40-50 Megabyte RAM verwenden, was offensichtlich mehr ist als die erwähnte maximale RAM-Auslastung von beispielsweise 32 MB. Wie bestimmt Android, wie viel RAM eine App verwenden kann? Wie ist es möglich, dass Apps diese Grenze überschreiten?
Außerdem habe ich festgestellt, dass einige meiner Apps (vom System getötet?) Mit einer OutOfMemoryException abstürzen, wenn etwa 30-40 Megabyte verwendet werden. Auf der anderen Seite laufen auf meinem Telefon Apps mit 100 MB und mehr nach einiger Zeit (wahrscheinlich aufgrund von Speicherlecks), die nicht abstürzen oder abgetötet werden. Es hängt also natürlich auch von der App selbst ab , wie viel RAM gespart werden kann. Wie ist das möglich? (Ich habe meine Tests mit einem HTC One S mit 768 MB RAM durchgeführt.)
Haftungsausschluss: Ich bin in keiner Weise mit der Android Task Manager-App verbunden.
quelle
Es ist Ende 2018, also haben sich die Dinge geändert.
Zunächst einmal: Führen Sie Ihre App aus und öffnen Sie die Registerkarte Android Profiler in Android Studio. Sie werden sehen, wie viel Speicher es verbraucht, Sie werden überrascht sein, aber es kann viel RAM zuweisen.
Außerdem finden Sie hier einen großartigen Artikel in offiziellen Dokumenten mit detaillierten Anweisungen zur Verwendung von Memory Profiler, mit denen Sie einen detaillierten Einblick in Ihre Speicherverwaltung erhalten.
In den meisten Fällen reicht Ihnen jedoch Ihr regulärer Android Profiler.
Normalerweise startet eine App mit 50 MB RAM-Zuweisung, springt jedoch sofort auf 90 MB, wenn Sie einige Fotos in den Speicher laden. Wenn Sie Activity mit einem ViewPager mit vorinstallierten Fotos (jeweils 3,5 MB) öffnen, erhalten Sie in Sekundenschnelle 190 MB.
Dies bedeutet jedoch nicht, dass Sie Probleme mit der Speicherverwaltung haben.
Der beste Rat, den ich geben kann, ist, die Richtlinien und Best Practices zu befolgen, Top-Bibliotheken zum Laden von Bildern zu verwenden (Glide, Picasso) und alles in Ordnung zu sein.
Wenn Sie jedoch etwas anpassen müssen und wirklich wissen müssen, wie viel Speicher Sie manuell zuweisen können, können Sie den gesamten freien Speicher abrufen und einen festgelegten Anteil (in%) daraus berechnen. In meinem Fall musste ich entschlüsselte Fotos im Speicher zwischenspeichern, damit ich sie nicht jedes Mal entschlüsseln muss, wenn der Benutzer durch die Liste gleitet.
Zu diesem Zweck können Sie die gebrauchsfertige LruCache-Klasse verwenden . Es handelt sich um eine Cache-Klasse, die automatisch nachverfolgt, wie viel Speicher Ihre Objekte zuweisen (oder wie viele Instanzen), und die älteste entfernt, um die aktuelle anhand ihres Verwendungsverlaufs zu erhalten. Hier ist ein großartiges Tutorial zur Verwendung.
In meinem Fall habe ich zwei Instanzen von Caches erstellt: für Daumen und Anhänge. Sie wurden mit Singleton-Zugriff statisch gemacht, sodass sie global in der gesamten App verfügbar sind.
Cache-Klasse:
So berechne ich den verfügbaren freien RAM und wie viel kann ich daraus herausbeißen:
Und so verwende ich es in Adaptern, um zwischengespeicherte Bilder zu erhalten:
und wie ich es im Hintergrund-Thread in den Cache setze (reguläre AsyncTask):
Meine App zielt auf API 19+ ab, sodass Geräte nicht alt sind und diese Teile des verfügbaren Arbeitsspeichers in meinem Fall für den Cache ausreichen (1% und 3%).
Unterhaltsame Tatsache: Android verfügt über keine APIs oder andere Hacks, um die Ihrer App zugewiesene Speichermenge abzurufen. Sie wird im laufenden Betrieb anhand verschiedener Faktoren berechnet.
PS Ich verwende ein statisches Klassenfeld, um einen Cache zu speichern, aber gemäß den neuesten Android-Richtlinien wird empfohlen, die ViewModel-Architekturkomponente für diesen Zweck zu verwenden.
quelle
Die Speicherbeschränkungen pro App hängen hier von der Bildschirmgröße und der Android-Version ab: https://drive.google.com/file/d/0B7Vx1OvzrLa3Y0R0X1BZbUpicGc/view?usp=sharing
Quelle: Android-Kompatibilitäts-Downloads http://source.android.com/compatibility/downloads.html ; CDD (Compatibility Definition Document), Abschnitt Kompatibilität mit virtuellen Maschinen oder Laufzeitkompatibilität
quelle