Wie kann man den OOM-Wert einer App dauerhaft senken?

Ich fordere die Speicherverwaltungstechnik von Android nicht heraus (wie es Killer tun). Ich möchte einer App nur eine höhere Priorität geben, auch wenn sie nicht im Vordergrund oder sichtbar ist (mit Benachrichtigung).

AutoKiller Memory Optimizer kann dies auf gerooteten Geräten tun, aber die Änderung dauert einige Sekunden, wenn ich Multitasking mache.

Ich möchte dies dauerhaft tun: Vielleicht sollte es funktionieren, einen Hintergrund-Daemon auszuführen, um kontinuierlich Änderungen vorzunehmen. Wie macht man das?

Selbes Problem hier. Sie können v6 Supercharger verwenden, um Ihre Probleme teilweise zu beheben.
Sie könnten den Entwickler bitten, der App einen (optionalen) Dienst hinzuzufügen. Apps, die mit einem Dienst verbunden sind, werden mit geringerer Wahrscheinlichkeit von OOM beendet.
@Izzy Die Priorität von Apps mit Diensten ist niedriger als die von Vordergrund- und sichtbaren. Übrigens, wie viele Entwickler schlagen Sie mir vor zu berechnen? Es ist keine Lösung...
@SachinShekhar du hast Recht, aber bei einem laufenden Dienst ist das Prio immer noch höher als bei anderen "Hintergrund-Apps", soweit ich mich erinnere. Und soweit ich verstanden habe, waren Sie an einer bestimmten App interessiert - also würde ich diesen bestimmten Entwickler vorschlagen :) Aber OK, es war nur ein Vorschlag . Tut mir leid, dass es dir nicht weiterhilft, aber einen Versuch war es wert.
Haben Sie eine Anwendung im Speicher behalten aktiviert ? Sieht so aus, als würde das deine Frage beantworten.

Antworten (3)

Auf XDA habe ich einen Beitrag gefunden, in dem diskutiert wird, wie man eine App pinnt, um nicht von OOM getötet zu werden. Da Ihre Frage anzeigt, dass Ihr Gerät gerootet ist, könnte dies für Sie nützlich sein. Das dort beschriebene Prinzip kann auch auf Ihren Fall angewendet werden, indem Sie einfach den oom_adjangegebenen Wert ändern (das -17würde dauerhaft PIN, höchste Priorität -- verwenden Sie also einen größeren Wert, um das zu "schwächen").

Das dort gepostete Skript sieht so aus:

#!/system/bin/sh
sleep 60

PPID=$(pidof com.estrongs.android.safer)
echo "-17" > /proc/$PPID/oom_adj

Ein anonymer Benutzer bemerkte, dass Sie diese Datei auch auf schreibgeschützte Berechtigungen setzen könnten, um zu verhindern, dass Android sie aktualisiert, indem Sie chmod 444 /proc/$PPID/oom_adjdas obige Skript ergänzen (der vorgeschlagene 444 bedeutet nichts anderes als Leseberechtigung, beeinträchtigt jedoch nicht die Fähigkeit des Systems, die Datei zu entfernen, wenn der Prozess endet). Ich habe das nicht überprüft, aber dies könnte Sie tatsächlich davor bewahren, das Skript zu wiederholen/wiederholt auszuführen, wodurch der festgelegte Wert für die Dauer des Prozesses dauerhaft wird.

Ersetzen Sie wie gesagt das -17durch Ihren gewählten Wert. Ersetzen Sie außerdem den Paketnamen der App ( com.estrongs.android.safer) durch den Paketnamen Ihrer Ziel-App. Sie können den sleepWert auch verringern oder den Schlaf ganz weglassen.

Jetzt brauchen Sie eine Möglichkeit, dies automatisch auszuführen, sobald Ihre App ausgeführt wird. Für diesen Teil könnten Sie z. B. Tasker verwenden : Kontext wäre „app running“ (und Ihre App ausgewählt) und die Aufgabe „Run Shell“ mit obigem Skript als Parameter. Sobald Sie dann Ihre App starten (und sie in den Vordergrund kommt), würde Tasker das Skript ausführen – und der oom_adjWert sollte angewendet werden.

Ich bemerke, dass sich der Wert von oom_adj ändert, wenn ich die App in den Hintergrund stelle. Bedeutet dies, dass die App tatsächlich entpinnt wurde?

Dies kann nicht über den Code einer Anwendung (Hintergrunddienst oder Thread oder was auch immer) erfolgen. Der Grund ist in diesem Beitrag gut beschrieben, http://debuggingisfun.blogspot.com/2014/03/android-foolproof-low-memory-killer.html

Willkommen bei Android-Enthusiasten! Während dies die Frage theoretisch beantworten kann, wäre es vorzuziehen , die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen.

ROM Toolbox Pro von Jrummy hat einen integrierten OOM-Manager.

Das ist ähnlich wie bei AutoKiller Memory Optimizer .. Lesen Sie die Frage noch einmal..