Gefrierschrank für im Cache gespeicherte Apps

Android 11 QPR3 oder höher unterstützt die App-Cache-Einfrierung. Diese Funktion beendet die Ausführung für im Cache gespeicherte Prozesse und reduziert die Ressourcennutzung durch Apps mit Fehlverhalten, die möglicherweise versuchen, im Cache zu arbeiten. Das Framework friert gecachte Apps ein, indem es ihre Prozesse in eine eingefrorene cgroup migriert. Dadurch wird die aktive und inaktive CPU-Auslastung bei aktiven gecachten Apps reduziert. Der App Freezer kann mit einem Systemkonfigurations-Flag oder einer Entwickleroption aktiviert werden.

App-Einfrieren implementieren

Der Cache-App-Freezer nutzt den Kernel-cgroup v2-Freezer. Auf Geräten mit einem kompatiblen Kernel kann dieser (optional) aktiviert werden. Aktivieren Sie dazu die Entwickleroption „Ausführung für im Cache gespeicherte Apps anhalten“ oder setzen Sie das Gerätekonfigurationsflag activity_manager_native_boot use_freezer auf true. Beispiel:

adb shell device_config put activity_manager_native_boot use_freezer true && adb reboot

Der Freezer ist deaktiviert, wenn das Flag use_freezer auf „false“ gesetzt oder die Entwickleroption deaktiviert ist. Sie können diese Einstellung ändern, indem Sie eine Gerätekonfiguration in einem Softwarerelease oder -update ändern.

Der Apps Freezer stellt keine offiziellen APIs bereit (und hat keinen Referenzimplementierungsclient), sondern verwendet die ausgeblendeten System-APIs setProcessFrozen und enableFreezer. Weitere Informationen zu diesen APIs finden Sie unter Process.java von ActivityManager und der ActivityManagerService API. Entwickler können für Tests auch auf den Clientcode in ActivityManager verweisen.

Benutzerdefinierte Funktionen verarbeiten

In der Regel wird von Prozessen im Cache nicht erwartet, dass sie ausgeführt werden. Einige Anwendungen haben jedoch möglicherweise benutzerdefinierte Funktionen, die von Prozessen unterstützt werden, die im Cache ausgeführt werden sollen. Wenn der App-Freezer auf einem Gerät aktiviert ist, auf dem eine solche App ausgeführt wird, werden die im Cache gespeicherten Prozesse eingefroren. Dies kann dazu führen, dass benutzerdefinierte Funktionen nicht mehr funktionieren.

Wenn eine App einen Prozess hat, der Aktivitäten ausführen muss, während er im Cache ist, ändern Sie den Prozessstatus in „Nicht im Cache“ (z. B. Bound ForeGround Service (BFGS) oder Vordergrund), bevor der Prozess eine Arbeit ausführen muss, damit die App aktiv bleiben kann.

App-Freezer testen

Verwende die folgenden Ressourcen, um zu überprüfen, ob der App-Gefrierschrank wie vorgesehen funktioniert:

  • Verwenden Sie den Befehl adb shell dumpsys activity und grep nach Apps frozen:, um eine Liste der eingefrorenen Prozesse aufzurufen.

  • Prüfen Sie, ob die Datei /sys/fs/cgroup/uid_0/cgroup.freeze vorhanden ist.

  • Logcat anzeigen, das jedes Mal eingefrorene und nicht eingefrorene Einträge anzeigt, wenn ein Prozess in das oder aus dem Gefrierschrank migriert wird. Beispiel:

    adb logcat | grep -i "\(freezing\|froze\)"