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 coloca 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 detenida forzada no ejecuta trabajos ni alertas en segundo plano y no puede enviar notificaciones automáticas. Cuando el usuario vuelve a utilizar la aplicación, la aplicación sale de la hibernación y los trabajos/alertas/notificaciones se ejecutan nuevamente como de costumbre. Cualquier trabajo/alerta/notificación que se haya programado antes de que la aplicación entrara en hibernación debe reprogramarse.

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 cambios que se basan en el uso de la aplicación, similar al requisito 3.5.1 existente. La hibernación de aplicaciones sigue estos requisitos.

El código marco se encuentra en:

La lógica política reside en:

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

Arquitectura de alto nivel

El servicio del sistema de hibernación de aplicaciones optimiza el almacenamiento de las aplicaciones que un usuario utiliza con poca frecuencia 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 aún esté disponible para el usuario a través del Iniciador 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
  • optimizando el paquete de hibernación

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

La determinación de cuándo debe hibernar un paquete está impulsada principalmente por UsageStatsService y administrada por AppHibernationJobService en PermissionController . Esta lógica de política reside 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 ocurren todos los ahorros/optimizaciones reales. AppHibernationService se comunica con varias partes del sistema para detener el paquete, eliminar datos de la 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 pueden hibernarse.

De manera similar a la revocación automática, el usuario recibe una notificación sobre qué aplicaciones están hibernadas 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.

Seguimos 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 existentes.

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 porque los componentes de la plataforma (como el nuevo servicio del sistema) no están presentes. La revocación automática continúa funcionando tal como está implementada actualmente para las versiones anteriores del sistema operativo.

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

Personalización

Dado que parte de la implementación es parte del componente del sistema modular, se desaconseja a los socios modificar la característica. En cambio, los socios pueden implementar características/funcionalidades similares siempre que sigan los requisitos de CDD.

La hibernación de aplicaciones debe estar activada de forma predeterminada para todas las aplicaciones orientadas 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 orientadas a Android 11 y Android 12. Más específicamente, la hibernación de aplicaciones solo funciona para aplicaciones orientadas a Android 11, mientras que esencialmente es solo una revocación automática para aplicaciones orientadas a Android 12.

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

Pruebas

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