Ein durchschnittlicher Android-Nutzer installiert mehr als 50 Apps auf seinen Geräten. Die Anzahl steigt mit der RAM-Klasse der Geräte. Viele dieser Apps werden jedoch über einen längeren Zeitraum nicht vom Nutzer verwendet.
Beim App-Ruhezustand werden Apps, die der Nutzer einige Monate lang nicht verwendet, in den Ruhezustand versetzt. Das funktioniert ähnlich wie beim automatischen Widerrufen von Berechtigungen. Dadurch wird die App zwangsweise beendet und in einen Zustand versetzt, in dem wir den Speicherplatz anstelle der Leistung optimieren. Die automatische Aufhebung von Berechtigungen ist ebenfalls in diesem Status enthalten und beide teilen sich dieselbe Ausnahmeeinstellung in den Einstellungen. Eine erzwungene App führt keine Jobs oder Benachrichtigungen im Hintergrund aus und kann keine Push-Benachrichtigungen senden. Wenn der Nutzer die App wieder verwendet, wird der Ruhezustand beendet und Jobs, Benachrichtigungen und Hinweise werden wieder wie gewohnt ausgeführt. Alle Jobs, Benachrichtigungen und Hinweise, die vor dem Ruhezustand der App geplant waren, müssen neu geplant werden.
Wenn OEMs die Plattform ändern, kann dies zu Konflikten mit der Implementierung des App-Ruhezustands führen. Beispiel:
- Wenn Sie die Definition der App-Nutzung ändern oder Methoden zum Aktivieren einer App einführen, die nicht in AOSP enthalten sind, kann dies die Genauigkeit des App-Ruhezustands beeinträchtigen.
- Der proprietäre Einschränkungsmechanismus eines OEM, der dem App-Ruhezustand ähnelt, kann einen ähnlichen Zweck erfüllen. Beide können vorhanden sein, es kann aber zu Überschneidungen kommen.
Im CDD werden neue Anforderungen für Änderungen beschrieben, die auf der App-Nutzung basieren, ähnlich der bestehenden Anforderung 3.5.1. Für den App-Ruhezustand gelten die folgenden Anforderungen.
Der Framework-Code befindet sich in:
- repo: platform/frameworks/base
- Verzeichnis: services/core/java/com/android/server/apphibernation
Die Richtlinienlogik befindet sich in:
- repo: platform/packages/modules/Permission
- Verzeichnis: PermissionController/src/com/android/permissioncontroller/hibernation
Gesamtarchitektur
Der Systemdienst „App-Ruhezustand“ optimiert selten verwendete Apps eines Nutzers für den Speicher und verhindert, dass diese Apps im Hintergrund ausgeführt werden. Um diese Ergebnisse zu erzielen, gehen wir beim Ruhezustand einer App folgendermaßen vor:
- Berechtigungen automatisch widerrufen
- Beenden der App erzwingen
- ODEX- und VDEX-Dateien löschen
- App-Cache löschen
Unser Ziel ist es, den Ruhezustand als reversible Aktion zu implementieren, damit die App für den Nutzer weiterhin über den Launcher und andere Oberflächen verfügbar ist und die App-Daten intakt bleiben. Beim Starten der App wird sie aus dem Zustand des erzwungenen Stopps wiederhergestellt und die ODEX- und VDEX-Dateien werden wie gewohnt erstellt.
Das geplante Design konzentriert sich auf zwei Hauptbereiche:
- Festlegen, wann ein Paket in den Ruhezustand versetzt werden soll
- In den Ruhezustand versetztes Paket optimieren
Ein neuer Systemdienst, AppHibernationService, und ein Jobdienst, AppHibernationJobService,, inPermissionController sind die Komponenten, die die gesamte Entscheidungsfindung und Logik steuern.
Die Entscheidung, wann ein Paket in den Ruhezustand versetzt werden soll, wird hauptsächlich von UsageStatsService getroffen und von AppHibernationJobService in PermissionController verwaltet. Die Logik dieser Richtlinie befindet sich in PermissionController, damit wir sie dynamisch über Mainline aktualisieren können. Außerdem planen wir, ein neues Signal hinzuzufügen: die Nutzung von Komponenten. Damit soll die Nutzung der Komponenten des Pakets (z. B. Dienste, Contentanbieter) als neuer Messwert in UsageStatsService erfasst werden.
Bei der Optimierung eines Pakets werden alle tatsächlichen Einsparungen und Optimierungen vorgenommen. AppHibernationService kommuniziert mit verschiedenen Teilen des Systems, um das Paket zu stoppen, Cache-Daten und ART-Artefakte zu löschen usw.
Der Berechtigungsentzug wird direkt von AppHibernationJobService aus initiiert, um die Funktion zum automatischen Entzug auf Geräten mit Android 11 und niedriger beizubehalten.
Nutzererfahrung
Der Nutzer erhält sowohl Informationen als auch Steuerelemente, mit denen er festlegen kann, welche Apps in den Ruhezustand versetzt werden können.
Ähnlich wie beim automatischen Widerruf erhält der Nutzer eine Benachrichtigung darüber, welche Apps in den Ruhezustand versetzt wurden. Er hat die Möglichkeit, über die Benachrichtigung direkt zu den Einstellungen zu gehen, um die App zu öffnen und aus dem Ruhezustand zu holen oder die nicht verwendete App bei Bedarf zu löschen.
Wir unterstützen weiterhin die Absicht des Entwicklers, den Nutzer um eine Ausnahme vom Ruhezustand zu bitten, mit der bestehenden Absicht zur Ausnahme vom automatischen Entziehen von Berechtigungen.
Abwärtskompatibilität
Funktionen speziell für den Ruhezustand sind ab Android 12 verfügbar. Diese Funktion konnte in früheren Versionen nicht ausgeführt werden, da die Plattformkomponenten (z. B. der neue Systemdienst) nicht vorhanden sind. Das automatische Aufheben von Berechtigungen funktioniert weiterhin wie in den früheren Betriebssystemversionen.
Ab Android 12 wird auf der Seite der App unter Apps & Benachrichtigungen in den Einstellungen ein Ein/Aus-Schalter für den Ruhezustand hinzugefügt, um die Abwärtskompatibilität zu gewährleisten. Der ursprüngliche Ein/Aus-Schalter für den automatischen Widerruf bleibt im Untermenü Berechtigungen erhalten. Mit diesem Schalter wird die allgemeine Ausnahme vom App-Ruhezustand für die App gesteuert.
Anpassung
Ein Teil der Implementierung ist Teil einer modularen Systemkomponente. Partner sollten die Funktion daher nicht ändern. Partner können stattdessen ähnliche Funktionen oder Features implementieren, sofern sie die CDD-Anforderungen einhalten.
Der App-Ruhezustand sollte standardmäßig für alle Apps aktiviert sein, die auf Android 11 oder höher ausgerichtet sind. Dies entspricht dem automatischen Entziehen von Berechtigungen. Die Einstellung selbst ist möglicherweise aktiviert, die Implementierung des App-Ruhezustands kann sich jedoch zwischen Apps, die auf Android 11 ausgerichtet sind, und Apps, die auf Android 12 ausgerichtet sind, unterscheiden. Genauer gesagt funktioniert der App-Ruhezustand nur für Apps, die auf Android 11 ausgerichtet sind. Für Apps, die auf Android 12 ausgerichtet sind, wird die Berechtigung automatisch widerrufen.
Außerdem implementieren OEMs möglicherweise eine ähnliche Funktion. Diese Funktionen sind jedoch auf einen viel kürzeren Zeitraum für Akkuoptimierungen ausgerichtet, die OEM-spezifisch sein können. Ähnliche Funktionen zur App-Einschränkung, die von OEMs entwickelt wurden, können parallel zum System für den Ruhezustand von Apps verwendet werden, sofern sie die im CDD definierten Kriterien erfüllen.
Test
Für die Funktion „App-Ruhezustand“ gibt es CTS- und Unit-Tests, um sicherzustellen, dass sie ordnungsgemäß funktioniert.
AutoRevokeTestAppHibernationIntegrationTest