Cache für 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 Systemkonfigurationsflag 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 die Funktion (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), verwendet aber die versteckten System-APIs setProcessFrozen und enableFreezer. Weitere Informationen zu diesen APIs finden Sie unter Process.java von ActivityManager und der ActivityManagerService API. Entwickler können sich für Tests auch auf den Clientcode in ActivityManager beziehen.

Benutzerdefinierte Funktionen verarbeiten

Normalerweise sollten Prozesse im Cache nicht ausgeführt werden. Einige Apps 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 mit einer solchen App aktiviert ist, werden die im Cache gespeicherten Prozesse eingefroren und möglicherweise können benutzerdefinierte Funktionen nicht mehr verwendet werden.

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

Mit den folgenden Ressourcen können Sie prüfen, ob der App-Freezer wie vorgesehen funktioniert:

  • Verwenden Sie den Befehl adb shell dumpsys activity und suchen Sie mit 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.

  • Sehen Sie sich „logcat“ an. Hier werden eingefrorene und nicht eingefrorene Einträge angezeigt, jedes Mal, wenn ein Prozess in den Freezer migriert oder daraus migriert. Beispiel:

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