Hibernación de la aplicación

Un usuario promedio de Android instala más de 50 aplicaciones en sus dispositivos (el número aumenta a medida que aumenta el nivel de RAM de los dispositivos). Sin embargo, un número significativo de estas aplicaciones no son utilizadas por el usuario durante un largo período de tiempo.

La hibernación de aplicaciones hiberna las aplicaciones que el usuario no usa durante algunos meses, de forma similar a la revocación automática de permisos. Esto fuerza la detención de la aplicación y la pone en un estado en el que optimizamos el almacenamiento en lugar del rendimiento. La revocación automática de permisos también se incluye con este estado y comparten la misma configuración de exención en Configuración . Una aplicación de detención forzada no ejecuta tareas ni alertas en segundo plano y no puede enviar notificaciones automáticas. Cuando el usuario usa la aplicación nuevamente, la aplicación sale de la hibernación y los trabajos/alertas/notificaciones se ejecutan nuevamente como de costumbre. Todos los trabajos/alertas/notificaciones que se programaron antes de que la aplicación entrara en hibernación deben volver a programarse.

Los OEM que modifican la plataforma pueden entrar en conflicto con la implementación de la hibernación de la aplicación. Por ejemplo

  • Modificar la definición de uso de la aplicación o introducir formas de activar una aplicación que no está en AOSP puede interrumpir la precisión de la hibernación de la aplicación.
  • El mecanismo de restricción patentado de un OEM similar a la hibernación de aplicaciones puede tener un propósito similar. Si bien ambos pueden existir, puede haber cierta superposición.

CDD describe un nuevo conjunto de requisitos para los cambios que se basan en el uso de la aplicación, similar al requisito 3.5.1 existente. La hibernación de la aplicación sigue estos requisitos.

El código del marco vive en:

La lógica de la política vive en:

  • repositorio: plataforma/paquetes/módulos/Permiso
  • directorio: PermissionController/src/com/android/permissioncontroller/hibernation

Arquitectura de alto nivel

El servicio del sistema App Hibernation optimiza las aplicaciones de uso poco frecuente de un usuario para el almacenamiento y evita que esas aplicaciones se ejecuten en segundo plano. Para lograr estos resultados, cuando hibernamos una aplicación, específicamente:

  • Permisos de revocación automática
  • Forzar la detención de la aplicación
  • Eliminar los archivos ODEX y VDEX
  • Eliminar el caché de la aplicación

Nuestro objetivo es implementar la hibernación como una acción reversible para que la aplicación siga estando disponible para el usuario a través del Lanzador y otras superficies con los datos de la aplicación intactos. Al iniciar la aplicación, la restauraremos desde el estado de detención forzada y continuaremos con la creación de archivos ODEX y VDEX como de costumbre.

El diseño planificado se centra en dos partes principales:

  • determinar cuándo un paquete debe hibernar
  • optimizar el paquete de hibernación

Un nuevo servicio del sistema, AppHibernationService , y un servicio de trabajo, AppHibernationJobService, en PermissionController es el pegamento que controla la toma de decisiones y la lógica general.

La determinación de cuándo un paquete debe hibernar está impulsada principalmente por UsageStatsService y administrada por AppHibernationJobService en PermissionController . Esta lógica de política vive en PermissionController para permitirnos actualizar dinámicamente a través de Mainline. Además, planeamos agregar una nueva señal, el uso de componentes, para capturar el uso de los componentes del paquete (por ejemplo, servicios, proveedores de contenido) como una nueva métrica en UsageStatsService .

La optimización de un paquete es donde suceden todos los ahorros/optimizaciones reales. AppHibernationService comunica con varias partes del sistema para detener el paquete, eliminar datos de caché, eliminar artefactos ART, etc. La revocación de permisos se inicia directamente desde AppHibernationJobService para conservar la funcionalidad de revocación automática en dispositivos con Android 11 y versiones anteriores.

Experiencia de usuario

El usuario recibe información y controles sobre qué aplicaciones se pueden hibernar.

Similar a la revocación automática, el usuario recibe una notificación sobre qué aplicaciones están en hibernación y tiene la opción de ir a Configuración directamente desde la notificación para abrir la aplicación y sacarla de la hibernación o eliminar la aplicación no utilizada si es necesario.

Continuamos apoyando la intención del desarrollador de solicitar al usuario una exención de la hibernación a través de la intención de exención de revocación automática de permisos existente.

Compatibilidad con versiones anteriores

Las funciones específicas de hibernación están disponibles a partir de Android 12. Estas funciones no podían funcionar en versiones anteriores ya que los componentes de la plataforma (como el nuevo servicio del sistema) no están presentes. La revocación automática continúa funcionando como se implementó actualmente para las versiones anteriores del sistema operativo.

A partir de Android 12, para garantizar la compatibilidad con versiones anteriores, se agrega un interruptor de hibernación en la página de la aplicación en Aplicaciones y notificaciones en Configuración mientras se mantiene el interruptor original de revocación automática dentro del submenú Permisos . Esta opción controla la exención general del sistema de hibernación de la aplicación para la aplicación.

personalización

Dado que parte de la implementación es parte del componente del sistema modular, se desaconseja que los socios modifiquen la función. En su lugar, los socios pueden implementar características/funcionalidades similares siempre que cumplan con los requisitos de CDD.

La hibernación de la aplicación debe estar ACTIVADA de forma predeterminada para todas las aplicaciones destinadas a Android 11 o superior. Esto es lo mismo que la revocación automática de permisos. Si bien la configuración en sí puede estar ACTIVADA, la implementación de la hibernación de la aplicación puede diferir entre las aplicaciones dirigidas a Android 11 y Android 12. Más específicamente, la hibernación de la aplicación solo funciona para las aplicaciones dirigidas a Android 11, mientras que esencialmente solo se revoca automáticamente para las aplicaciones dirigidas a Android 12.

Además, los OEM pueden implementar una característica similar. Sin embargo, esas características están dirigidas a una escala de tiempo mucho más corta para las optimizaciones de la batería que pueden ser específicas del OEM. Cualquier característica de restricción de aplicaciones similar desarrollada por los OEM puede coexistir con el sistema de hibernación de aplicaciones siempre que cumpla con los criterios existentes definidos en CDD .

Pruebas

La hibernación de la aplicación tiene CTS y pruebas unitarias para garantizar que funcione correctamente.