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 nachApps 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\)"