Telefon löscht inaktive Anwendungen aus dem RAM, obwohl viel Speicherplatz frei ist

Das Telefon (Jiayu G4S) läuft mit Android 4.4.2, 2 GB RAM, Stock Jiayu.es ROM (Kernel 3.4.67)

Die Bestandskonfiguration richtet auch einen Swap in zram ein, ich habe ihn deaktiviert, scheint keinen Unterschied zu machen.

Der Task-Manager zeigt jederzeit mindestens 0,92 GB frei oder mehr an. Es zeigt höchstens 12-13 zwischengespeicherte inaktive Apps, die sich noch im RAM befinden, etwas mehr, wenn das Prozesslimit manuell auf einen hohen Wert gesetzt wird (nur aus Spaß wähle ich 100).

Laut dumpsys meminfo, sieht es jetzt so aus:

Total RAM: 2016644 kB
 Free RAM: 883420 kB (230000 cached pss + 131652 cached + 521768 free)
 Used RAM: 852001 kB (805401 used pss + 1684 buffers + 8972 shmem + 35944 slab)
 Lost RAM: 281223 kB
     ZRAM: 4 kB physical used for 0 kB in swap (0 kB total swap)
   Tuning: 256 (large 512), oom 122880 kB, restore limit 40960 kB (high-end-gfx)

Und dennoch werden häufig verwendete Anwendungen regelmäßig aus dem Speicher geworfen (im Task-Manager mit 0.00b zugewiesen angezeigt), was zu einer kleinen Verzögerung beim nächsten Start führt.

oomkiller-Parameter scheinen vernünftig zu sein

shell@G4:/ $ cat /sys/module/lowmemorykiller/parameters/minfree                
12288,15360,18432,21504,24576,30720

Warum werden häufig genutzte Programme rausgeschmissen, trotz all dem freien Speicher? Kann ich irgendetwas konfigurieren (ich habe Root-Zugriff)?

Antworten (1)

Und jetzt um mir selbst zu antworten. Wenn wir uns die Quellen von Android 4.4.2 (KOT39H) ansehen, haben wir in ProcessList.java eine maximale Anzahl von zwischengespeicherten Apps definiert, die auf einen beliebigen Wert von 24 festgelegt ist:

static final int MAX_CACHED_APPS = 24;

Dieser Wert wird von der computeEmptyProcessLimit-Funktion wie folgt weiter aufgeteilt: 2/3 gehen an das Limit für leere Prozesse und 1/3 gehen an das Limit für zwischengespeicherte Prozesse.

Jetzt haben wir also ein willkürliches Limit von 16 für leere und 8 für zwischengespeicherte Prozesse. (Aber kaufen Sie ein 3-GB-RAM-Telefon, um zu sehen, wie viel ungenutzter Speicher Sie haben werden.)

In Standard-Android ist die einzige Möglichkeit, dieses Limit zu ändern, zur Laufzeit über setProcessLimit(), was ein gerootetes Telefon, eine manuell in /system/priv-app installierte Anwendung und die erteilte SET_PROCESS_LIMIT-Berechtigung erfordert.

(In CM11 zum Beispiel kann es auch in build.prop gesetzt werden, aber dieser Code ist in Stock 4.4.2 nicht vorhanden)

Glücklicherweise gibt es auf github bereits eine solche Anwendung namens SetAndroidProcessLimit, die, korrekt installiert, funktioniert (mein Dank an den Autor)

Jetzt habe ich 20 zwischengespeicherte Apps im RAM, das sind ungefähr alle Apps, die ich häufig verwende, und jede von ihnen startet sofort und ohne Verzögerung.


Ich habe auch herausgefunden, wie man MAX_CACHED_APPS direkt in /system/framework/services.jar ändert

  • Laden Sie das Glas auf Ihren PC herunter, entpacken Sie das Glas
  • Klassen.dex dekompilieren mit Baksmali (oder per apktool)
  • Ändern Sie in ProcessList.smali und in ActivityManagerService.smali - da dies Bytecode ist, müssen Sie nicht nur die Deklaration von MAX_CACHED_APPS, sondern jedes Vorkommen davon durch den neuen gewünschten Wert ersetzen
  • Klassen.dex neu kompilieren
  • verpacken Sie die Dose neu
  • Herunterladen auf das Telefon, Ersetzen der ursprünglichen JAR-Datei (Sie müssen rw /system erneut einhängen)
  • starten Sie das Telefon neu; Mine wird den Dalvik-Cache automatisch regenerieren