Hibernation des applications

Un utilisateur Android moyen installe plus de 50 applications sur ses appareils (ce nombre augmente à mesure que le niveau de RAM des appareils augmente). Cependant, un nombre important de ces applications ne sont pas utilisées par l'utilisateur pendant une longue période.

L'hibernation des applications met en hibernation les applications que l'utilisateur n'utilise pas pendant quelques mois, comme la révocation automatique des autorisations. Cela force l'arrêt de l'application et la met dans un état où nous optimisons le stockage plutôt que les performances. La révocation automatique des autorisations est également associée à cet état et partage le même paramètre d'exemption dans Paramètres. Une application forcée à l'arrêt n'exécute pas de tâches ni d'alertes en arrière-plan et ne peut pas envoyer de notifications push. Lorsque l'utilisateur utilise à nouveau l'application, celle-ci quitte l'hibernation et les tâches, alertes et notifications s'exécutent à nouveau comme d'habitude. Toutes les tâches, alertes et notifications planifiées avant l'hibernation de l'application doivent être reprogrammées.

Les OEM qui modifient la plate-forme peuvent entrer en conflit avec l'implémentation de l'hibernation des applications. Exemple

  • La modification de la définition d'utilisation des applications ou l'introduction de méthodes d'activation d'une application qui ne sont pas dans AOSP peuvent perturber la justesse de l'hibernation de l'application.
  • Le mécanisme de restriction propriétaire d'un OEM, semblable à l'hibernation des applications, peut avoir un objectif similaire. Bien que les deux puissent exister, il peut y avoir un certain chevauchement.

Le CDD décrit un nouvel ensemble d'exigences pour les modifications basées sur l'utilisation des applications, semblables à l'exigence 3.5.1 existante. L'hibernation des applications respecte ces exigences.

Le code du framework se trouve dans :

La logique de la règle se trouve dans :

  • repo: platform/packages/modules/Permission
  • répertoire : PermissionController/src/com/android/permissioncontroller/hibernation

Architecture de haut niveau

Le service système d'hibernation des applications optimise le stockage des applications peu utilisées par un utilisateur et empêche ces applications de s'exécuter en arrière-plan. Pour obtenir ces résultats, lorsque nous mettons une application en hibernation, nous effectuons les actions suivantes :

  • Révocation automatique des autorisations
  • Forcer l'arrêt de l'application
  • Supprimer les fichiers ODEX et VDEX
  • Supprimer le cache de l'application

Notre objectif est d'implémenter l'hibernation comme une action réversible afin que l'application reste disponible pour l'utilisateur via le lanceur et d'autres surfaces avec des données d'application intactes. Au lancement de l'application, nous la restaurerons à partir de l'état d'arrêt forcé et poursuivrons la création des fichiers ODEX et VDEX comme d'habitude.

La conception prévue s'articule autour de deux parties principales :

  • Déterminer quand un package doit être mis en hibernation
  • Optimiser le package en hibernation

Un nouveau service système, AppHibernationService, et un service de tâches, AppHibernationJobService, dans PermissionController contrôlent la prise de décision et la logique globales.

La détermination du moment où un package doit être mis en hibernation est principalement alimentée par UsageStatsService et gérée par AppHibernationJobService dans PermissionController. Cette logique de règle se trouve dans PermissionController pour nous permettre d'effectuer des mises à jour dynamiques via Mainline. De plus, nous prévoyons d'ajouter un nouveau signal, l'utilisation des composants, pour capturer l'utilisation des composants du package (par exemple, les services, les fournisseurs de contenu) en tant que nouvelle métrique dans UsageStatsService.

L'optimisation d'un package est l'endroit où toutes les économies et optimisations réelles se produisent. AppHibernationService communique avec différentes parties du système pour arrêter le package, supprimer les données de cache, supprimer les artefacts ART, etc. La révocation des autorisations est directement lancée à partir de AppHibernationJobService pour conserver la fonctionnalité de révocation automatique sur les appareils Android 11 et versions antérieures.

Expérience utilisateur

L'utilisateur reçoit des informations et des commandes sur les applications qui peuvent être mises en hibernation.

Comme pour la révocation automatique, l'utilisateur reçoit une notification indiquant les applications mises en hibernation et a la possibilité d'accéder aux paramètres directement depuis la notification pour ouvrir l'application et la sortir de l'hibernation ou supprimer l'application inutilisée si nécessaire.

Nous continuons de prendre en charge l'intention du développeur de demander à l'utilisateur une exemption d'hibernation avec l'intention d'exemption de révocation automatique des autorisations existante.

Rétrocompatibilité

Les fonctionnalités spécifiques à l'hibernation sont disponibles à partir d'Android 12. Cette fonctionnalité ne pouvait pas fonctionner sur les versions antérieures, car les composants de la plate-forme (tels que le nouveau service système) ne sont pas présents. La révocation automatique continue de fonctionner comme implémentée pour les versions antérieures du système d'exploitation.

À partir d'Android 12, pour assurer la rétrocompatibilité, un bouton d'hibernation est ajouté sur la page de l'application sous Applications et notifications dans Paramètres tout en conservant le bouton de révocation automatique d'origine dans le sous-menu Autorisations. Ce bouton contrôle l'exemption globale du système d'hibernation des applications pour l'application.

Personnalisation

Une partie de l'implémentation fait partie d'un composant système modulaire. Les partenaires sont donc invités à ne pas modifier la fonctionnalité. Les partenaires peuvent implémenter des fonctionnalités ou des fonctionnalités similaires à condition de respecter les exigences du CDD.

L'hibernation des applications doit être activée par défaut pour toutes les applications ciblant Android 11 ou version ultérieure. Cela revient à la révocation automatique des autorisations. Bien que le paramètre lui-même puisse être activé, l'implémentation de l'hibernation des applications peut différer entre les applications ciblant Android 11 et Android 12. Plus précisément, l'hibernation des applications ne fonctionne que pour les applications ciblant Android 11, alors qu'il s'agit essentiellement d'une révocation automatique pour les applications ciblant Android 12.

De plus, les OEM peuvent implémenter une fonctionnalité similaire. Toutefois, ces fonctionnalités sont ciblées sur une période beaucoup plus courte pour les optimisations de la batterie, qui peuvent être spécifiques à l'OEM. Toutes les fonctionnalités de restriction d'applications similaires développées par les OEM peuvent coexister avec le système d'hibernation des applications à condition de respecter les critères existants définis dans le CDD.

Tests

L'hibernation des applications comporte des tests CTS et unitaires pour s'assurer qu'elle fonctionne correctement.