Gefrierschrank für zwischengespeicherte Apps

Android 11 QPR3 oder höher unterstützt den Freezer für zwischengespeicherte Apps. Diese Funktion stoppt die Ausführung zwischengespeicherter Prozesse und reduziert die Ressourcennutzung durch fehlerhaftes Verhalten von Apps, die möglicherweise versuchen, im Cache zu funktionieren. Das Framework friert zwischengespeicherte Apps ein, indem es ihre Prozesse in eine eingefrorene cgroup migriert; Dies reduziert den aktiven und Leerlauf-CPU-Verbrauch bei aktiven zwischengespeicherten Apps. Der App-Freezer kann über ein Systemkonfigurationsflag oder eine Entwickleroption aktiviert werden.

Implementieren Sie den Apps-Freezer

Der Freezer für zwischengespeicherte Apps nutzt den Kernel-Cgroup-v2-Freezer. Geräte, die mit einem kompatiblen Kernel ausgeliefert werden, können diesen (optional) aktivieren. Aktivieren Sie dazu die Entwickleroption „Ausführung für zwischengespeicherte Apps anhalten“ oder setzen Sie das Gerätekonfigurations-Flag „ activity_manager_native_boot use_freezer “ auf „ true . Zum 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 ist oder die Entwickleroption deaktiviert ist. Sie können diese Einstellung umschalten, indem Sie eine Gerätekonfiguration in einer Softwareversion oder einem Update ändern.

Der Apps-Freezer stellt keine offiziellen APIs zur Verfügung (und verfügt nicht über einen Referenzimplementierungsclient), verwendet jedoch die versteckten System-APIs setProcessFrozen und enableFreezer . Einzelheiten zu diesen APIs finden Sie in Process.java von ActivityManager und in der ActivityManagerService-API. Entwickler können für Experimente auch auf den Client-Code in ActivityManager verweisen.

Behandeln Sie benutzerdefinierte Funktionen

Normalerweise wird von Prozessen nicht erwartet, dass sie im Cache ausgeführt werden. Einige Apps verfügen jedoch möglicherweise über benutzerdefinierte Funktionen, die von Prozessen unterstützt werden, von denen erwartet wird, dass sie im Cache ausgeführt werden. Wenn der Apps-Freezer auf einem Gerät aktiviert ist, auf dem eine solche App ausgeführt wird, werden die zwischengespeicherten Prozesse eingefroren und können dazu führen, dass benutzerdefinierte Funktionen nicht mehr funktionieren.

Um dieses Problem zu umgehen: Wenn eine App über einen Prozess verfügt, der Aktivitäten im Cache ausführen muss, ändern Sie den Prozessstatus in „Nicht zwischengespeichert“ (z. B. „Bound ForeGround Service“ (BFGS) oder „Foreground“), bevor der Prozess Arbeiten ausführen muss, um die App zuzulassen aktiv zu bleiben.

Testen Sie den Apps-Freezer

Um zu überprüfen, ob der App-Freezer wie vorgesehen funktioniert, verwenden Sie die folgenden Ressourcen:

  • Suchen Sie mit dem Befehl adb shell dumpsys activity nach einer Liste der eingefrorenen Prozesse und grep das Schlüsselwort Frozen .

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

  • Sehen Sie sich Logcat an, das jedes Mal eingefrorene und nicht eingefrorene Einträge anzeigt, wenn ein Prozess in den Gefrierschrank oder aus diesem heraus migriert. Zum Beispiel:

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