Konfiguration mit niedrigem RAM

Android unterstützt Geräte mit 512 MB RAM. Diese Dokumentation soll OEMs dabei helfen, den Android-Kernel 4.4 für Geräte mit geringem Arbeitsspeicher zu optimieren und zu konfigurieren. Einige dieser Optimierungen sind generisch genug, dass sie auch auf frühere Versionen angewendet werden können.

Plattformoptimierungen für Android-Kernel 4.4

Verbesserte Speicherverwaltung

  • Validierte speichersparende Kernel-Konfigurationen: Swap to Zram.
  • Stoppen Sie zwischengespeicherte Prozesse, wenn sie aus dem Cache entfernt werden und zu groß sind.
  • Lassen Sie nicht zu, dass sich große Dienste wieder in die A-Dienste-Klassifizierung einreihen (damit sie nicht dazu führen können, dass der Launcher gestoppt wird).
  • Stoppen Sie Prozesse (selbst normalerweise unaufhaltsame Prozesse wie den aktuellen IME), die bei der Leerlaufwartung zu groß werden.
  • Serialisieren Sie den Start von Hintergrunddiensten.
  • Optimieren Sie die Speichernutzung von Geräten mit niedrigem RAM: engere Anpassungsstufen für Out-of-Memory (OOM), kleinere Grafik-Caches.

Reduzierter Systemspeicher

  • Getrimmten system_server und System UI Prozesse (gespeicherte mehrere Megabyte).
  • Vorinstallierte Dex-Caches in Dalvik (mehrere Megabyte gespeichert).
  • Validierte JIT-off-Option (spart bis zu 1,5 MB pro Prozess).
  • Reduzierter Overhead für den Font-Cache pro Prozess.
  • Eingeführt ArrayMap / ArraySet und ausgiebig im Rahmen als leichter Fußabdruck Ersatz für gebrauchten HashMap / HashSet .

Prognosen

Es wurde eine Entwickleroption hinzugefügt, um den Speicherstatus und die App-Speichernutzung nach ihrer Ausführungshäufigkeit und der verbrauchten Speichermenge anzuzeigen.

API

Added ActivityManager.isLowRamDevice() Anwendungen zu ermöglichen , zu erkennen , wenn auf Low-Memory - Geräten mit und wählen zu deaktivieren großen RAM - Funktionen.

Speicherverfolgung

Hinzugefügt memtrack HAL Grafikspeicherzuordnungen, zusätzliche Informationen in verfolgen dumpsys meminfo, geklärt Zusammenfassungen in meminfo (zum Beispiel berichtet freien RAM enthält RAM zwischengespeichert Prozesse, so dass OEMs versuchen Sie nicht die falsche Sache zu optimieren).

Build-Time-Konfiguration

Low RAM Device Flag

Die ActivityManager.isLowRamDevice() Flag bestimmt , ob Apps sollten spezifische speicherintensive Funktionen , dass die Arbeit schlecht auf Low-Memory - Geräte auszuschalten.

Für 512 MB - Geräte wird dieser Flag zurückzuerwartet true . Sie kann durch die folgende Systemeigenschaft im Geräte-Makefile aktiviert werden.

PRODUCT_PROPERTY_OVERRIDES += ro.config.low_ram=true

Launcher-Konfigurationen

Der Standard - Hintergrund - Setup auf Launcher nicht Live Wallpaper verwenden. Geräte mit geringem Speicher sollten keine Live-Hintergründe vorinstallieren.

Kernel-Konfiguration

Kernel/ActivityManager optimieren, um die direkte Rückforderung zu reduzieren

Direkte Rückforderung tritt auf, wenn ein Prozess oder der Kernel versucht, eine Speicherseite zuzuweisen (entweder direkt oder aufgrund eines Fehlers in einer neuen Seite) und der Kernel den gesamten verfügbaren freien Speicher verwendet hat. Dies erfordert, dass der Kernel die Zuweisung blockiert, während er eine Seite freigibt. Dies wiederum erfordert oft Disk - I / O eine schmutzige Datei-backed Seite auszuspülen oder warten lowmemorykiller einen Prozess zu stoppen. Dies kann zu zusätzlichen E/A in jedem Thread führen, einschließlich eines UI-Threads.

Um zu vermeiden , direkte Rückforderungs hat der Kernel - Wasserzeichen , dass Trigger kswapd oder Hintergrund zurückzufordern. Dies ist ein Thread, der versucht, Seiten freizugeben, damit das nächste Mal, wenn ein echter Thread zugewiesen wird, dies schnell erfolgreich sein kann.

Der Standardschwellenwert zum Auslösen der Hintergrundrückforderung ist ziemlich niedrig, etwa 2 MB auf einem 2-GB-Gerät und 636 KB auf einem 512 MB-Gerät. Der Kernel fordert bei der Hintergrundrückforderung nur wenige Megabyte Speicher zurück. Dies bedeutet, dass jeder Prozess, der schnell mehr als ein paar Megabyte zuweist, schnell auf die direkte Rückforderung trifft.

Unterstützung für einen abstimmbaren Kernel wird im Android-3.4-Kernelzweig als Patch 92189d47f66c67e5fd92eafaa287e153197a454f ("add extra free kbytes tunable") hinzugefügt. Rosinenpickerei diesen Patch zu einem Kernel - Gerät erlaubt ActivityManager dem Kernel zu sagen , um zu versuchen , drei Vollbild 32 bpp Puffer Speicher frei zu halten.

Diese Schwellenwerte können mit der so konfiguriert werden config.xml Rahmen.

<!-- Device configuration setting the /proc/sys/vm/extra_free_kbytes tunable
in the kernel (if it exists).  A high value will increase the amount of memory
that the kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A low value allows more memory to be used by
processes but may cause more allocations to block waiting on disk I/O or
lowmemorykiller.  Overrides the default value chosen by ActivityManager based
on screen size.  0 prevents keeping any extra memory over what the kernel keeps
by default.  -1 keeps the default. -->
<integer name="config_extraFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the /proc/sys/vm/extra_free_kbytes
tunable in the kernel (if it exists).  0 uses the default value chosen by
ActivityManager.  A positive value  will increase the amount of memory that the
kernel tries to keep free, reducing allocation time and causing the
lowmemorykiller to kill earlier.  A negative value allows more memory to be
used by processes but may cause more allocations to block waiting on disk I/O
or lowmemorykiller.  Directly added to the default value chosen by
ActivityManager based on screen size. -->
<integer name="config_extraFreeKbytesAdjust">0</integer>

Einstellung von LowMemoryKiller

ActivityManager der Schwellenwerte des konfiguriert LowMemoryKiller seine Erwartung des Arbeits Satzes von Datei gesicherten Seiten ( im Cache gespeicherten Seiten) entsprechen erforderlich , um die Prozesse in jeder Prioritätsstufe Eimer laufen. Wenn ein Gerät hohe Anforderungen an das Workingset stellt, beispielsweise wenn die Benutzeroberfläche des Anbieters mehr Speicher benötigt oder wenn mehr Dienste hinzugefügt wurden, können die Schwellenwerte erhöht werden.

Die Schwellenwerte können reduziert werden, wenn zu viel Speicher für dateigestützte Seiten reserviert wird, sodass Hintergrundprozesse beendet werden, lange bevor ein Festplatten-Thrashing aufgrund eines zu kleinen Caches auftreten würde.

<!-- Device configuration setting the minfree tunable in the lowmemorykiller
in the kernel.  A high value will cause the lowmemorykiller to fire earlier,
keeping more memory in the file cache and preventing I/O thrashing, but
allowing fewer processes to stay in memory.  A low value will keep more
processes in memory but may cause thrashing if set too low.  Overrides the
default value chosen by ActivityManager based on screen size and total memory
for the largest lowmemorykiller bucket, and scaled proportionally to the
smaller buckets.  -1 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAbsolute">-1</integer>
<!-- Device configuration adjusting the minfree tunable in the
lowmemorykiller in the kernel.  A high value will cause the lowmemorykiller to
fire earlier, keeping more memory in the file cache and preventing I/O
thrashing, but allowing fewer processes to stay in memory.  A low value will
keep more processes in memory but may cause thrashing if set too low.  Directly
added to the default value chosen by          ActivityManager based on screen
size and total memory for the largest lowmemorykiller bucket, and scaled
proportionally to the smaller buckets. 0 keeps the default. -->
<integer name="config_lowMemoryKillerMinFreeKbytesAdjust">0</integer>

Zu Zram wechseln

zram swap kann die Menge des verfügbaren Speichers im System erhöhen, indem Speicherseiten komprimiert und in einen dynamisch zugewiesenen Swap-Bereich des Speichers gelegt werden. Dies tauscht CPU-Zeit gegen einen kleinen Speicherzuwachs. Berücksichtigen Sie diese Tatsache, wenn Sie die Leistungsauswirkungen eines Zram-Swaps auf Ihr System bewerten.

Android handhabt den Wechsel zu Zram auf mehreren Ebenen.

  • Aktivieren Sie zunächst diese Kernel-Optionen, um Zram-Swap effektiv zu verwenden:
    • CONFIG_SWAP
    • CONFIG_ZRAM
  • Fügen Sie eine Zeile , dass das sieht aus wie auf Ihre fstab:
    /dev/block/zram0 none swap defaults zramsize=<size in bytes>,swapprio=<swap partition priority>
    
    • zramsize ist obligatorisch und gibt an, wie viel Speicher unkomprimierte Sie den zram Bereich zu halten möchten. Sie können Kompressionsraten im Bereich von 30-50% erwarten.
    • swapprio ist optional und nur für den Einsatz , wenn Sie mehr als einen Swap - Bereich haben.

    Beschriften der zugehörigen Blockvorrichtung als swap_block_device in den gerätespezifischen sepolicy/file_contexts so dass es richtig durch SELinux behandelt wird .

    /dev/block/zram0 u:object_r:swap_block_device:s0
    
  • Standardmäßig lagert der Linux-Kernel acht Speicherseiten gleichzeitig aus. Bei der Verwendung von Zram sind die zusätzlichen Kosten für das Lesen einer Seite nach der anderen vernachlässigbar und können hilfreich sein, wenn das Gerät unter extremer Speicherbelastung steht. Um nur eine Seite auf einmal zu lesen, fügen Sie folgendes zu Ihrem init.rc :
    write /proc/sys/vm/page-cluster 0
    
  • In Ihrem init.rc nach der mount_all /fstab.X Linie hinzufügen:
    swapon_all /fstab.X
    
  • Die Speicher-Überwachungsgruppen werden beim Booten automatisch konfiguriert, wenn die Funktion im Kernel aktiviert ist.
  • Wenn der Speicher cgroups verfügbar ist, ActivityManager mit niedrigerer Priorität Threads als mehr swappable als andere Threads. Wenn der Speicher benötigt wird, startet der Android - Kernel - Speicherseiten zu zram Swap - Migration, eine höhere Priorität auf die Speicherseiten zu geben , die durch gekennzeichnet sind ActivityManager .

Carveouts, Ion und Contiguous Memory Allocation (CMA)

Bei Geräten mit geringem Speicher ist es wichtig, auf Carveouts zu achten, insbesondere auf solche, die nicht vollständig genutzt werden, z. B. Carveouts für die sichere Videowiedergabe. Es gibt verschiedene Lösungen, um die Auswirkungen Ihrer Carveout-Regionen zu minimieren, die von den genauen Anforderungen Ihrer Hardware abhängen.

Wenn die Hardware nicht zusammenhängende Speicherzuweisungen zulässt, ermöglicht der Ion-Systemheap Speicherzuweisungen aus dem Systemspeicher, wodurch ein Carveout überflüssig wird. Ion versucht auch, große Zuweisungen vorzunehmen, um den Druck des Übersetzungs-Lookaside-Puffers (TLB) auf Peripheriegeräte zu beseitigen. Wenn Speicherbereiche zusammenhängend oder auf einen bestimmten Adressbereich beschränkt sein müssen, kann der CMA verwendet werden.

Dadurch entsteht ein Carveout, den das System auch für bewegliche Seiten verwenden kann. Wenn die Region benötigt wird, werden bewegliche Seiten aus dieser migriert, sodass das System einen großen Carveout für andere Zwecke verwenden kann, wenn es kostenlos ist. Sie können CMA direkt mit dem Ionen-CMA-Heap verwenden.

Tipps zur App-Optimierung

  • Überprüfen Sie Verwalten Ihrer App - Speicher und diese Blog - Beiträge:
  • Entfernen Sie alle nicht verwendeten Vermögenswerte von vorinstallierten Anwendungen mit development/tools/findunused (dies hilft , die App zu verkleinern).
  • Verwenden Sie das PNG-Format für Assets, insbesondere wenn sie transparente Bereiche haben.
  • Wenn das Schreiben nativen Code, Verwendung calloc() statt malloc / memset .
  • Aktivieren Sie keinen Code, der Parcel-Daten auf die Festplatte schreibt und später liest.
  • Verwenden Sie die SSP-Filterung, anstatt jedes installierte Paket zu abonnieren. Fügen Sie wie folgt Filterung:
    <data android:scheme="package" android:ssp="com.android.pkg1" />
    <data android:scheme="package" android:ssp="com.myapp.act1" />
    

Verstehen Sie die verschiedenen Prozesszustände in Android

Zustand Bedeutung Einzelheiten
SERVICE
SERVICE_RESTARTING
Apps, die aus App-bezogenen Gründen im Hintergrund ausgeführt werden. SERVICE SERVICE_RESTARTING sind die häufigsten Probleme Anwendungen haben , wenn sie zu viel im Hintergrund laufen. Use% Dauer * pss oder% Laufzeit als "badness" Metrik. Im Idealfall sollten diese Apps überhaupt nicht ausgeführt werden.
IMPORTANT_FOREGROUND
RECEIVER
Apps, die im Hintergrund ausgeführt werden (nicht direkt mit dem Benutzer interagieren). Diese fügen dem System Speicherlast hinzu. Verwenden Sie die (% Dauer * pss) „Schlechtigkeit“ Wert , um diese Prozesse. Viele dieser Apps laufen jedoch aus guten Gründen. Die Größe der pss ist ein wichtiger Teil ihrer Speicherauslastung.
PERSISTENT Persistenter Systemprozess. Verfolgen Sie pss für diese Prozesse zu groß wird zu beobachten.
TOP Der Prozess, mit dem der Benutzer gerade interagiert. pss ist wichtig , hier Metrik, die zeigt , wie viel Speicher laden die App während der Verwendung erzeugt.
HOME
CACHED_EMPTY
Die Prozesse, die das System bereithält, falls sie wieder benötigt werden. Diese Prozesse können jederzeit frei beendet und bei Bedarf neu erstellt werden. Der Speicherzustand (normal, moderat, niedrig, kritisch) wird basierend darauf berechnet, wie viele dieser Prozesse das System ausführt. Die wichtige Kennzahl für diese Prozesse ist die pss. In diesem Zustand verringern diese Prozesse ihren Speicherbedarf so weit wie möglich, damit die maximale Gesamtzahl von Prozessen beibehalten werden kann. In diesem Zustand hat ein gut erzogene App im Allgemeinen eine deutlich kleinere pss Fußabdruck als es im TOP - Zustand.
CACHED_ACTIVITY
CACHED_ACTIVITY_CLIENT
Wenn sie mit im Vergleich TOP , diese zeigen , wie gut ein App - Speicher in den Hintergrund freigibt . Ohne CACHED_EMPTY Zustand macht diese Daten besser, weil es Situationen beseitigt , wenn der Prozess aus irgendwelchen Gründen neben der Interaktion mit dem Benutzer begonnen hat. Dadurch entfällt mit dem UI - Overhead zu tun CACHED_EMPTY erhält , wenn benutzerbezogene Aktivitäten.

Analyse

Startzeit der App analysieren

Um App-Startzeit zu analysieren, laufen $ adb shell am start -P oder --start-profiler und starten Sie Ihre App. Der Profiler startet, nachdem der Prozess von der Zygote abgezweigt wurde und bevor Code in die Abzweigung geladen wird.

Analyse mit Fehlerberichten

Fehlerberichte enthalten mehrere Dienstleistungen, einschließlich batterystats , netstats , procstats und usagestats , die für die Fehlersuche verwendet werden kann. Berichte können Zeilen wie diese enthalten:

------ CHECKIN BATTERYSTATS (dumpsys batterystats --checkin) ------
7,0,h,-2558644,97,1946288161,3,2,0,340,4183
7,0,h,-2553041,97,1946288161,3,2,0,340,4183

Prüfung auf persistente Prozesse

Um nach persistenten Prozessen zu suchen, starten Sie das Gerät neu und überprüfen Sie die Prozesse. Lassen Sie das Gerät dann einige Stunden laufen und überprüfen Sie die Prozesse erneut. Zwischen den beiden Prüfungen sollten keine lang andauernden Prozesse liegen.

Durchführung von Langlebigkeitstests

Um Langlebigkeitstests durchzuführen, lassen Sie das Gerät länger laufen und verfolgen Sie den Speicher der Prozesse, um festzustellen, ob er zunimmt oder konstant bleibt. Erstellen Sie dann kanonische Anwendungsfälle und führen Sie Langlebigkeitstests für diese Szenarien durch.