Hibernación de apps

Un usuario promedio de Android instala más de 50 apps en sus dispositivos (la cantidad aumenta a medida que aumenta el nivel de RAM de los dispositivos). Sin embargo, el usuario no usa una cantidad significativa de estas apps durante un período prolongado.

La hibernación de apps pone a hibernar las apps que el usuario no usa durante algunos meses, de manera similar a la revocación automática de permisos. Esto detiene la app de forma forzada 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 en este estado y comparte el mismo parámetro de configuración de exención en Configuración. Una app detenida de forma forzada no ejecuta trabajos ni alertas en segundo plano, y no puede enviar notificaciones push. Cuando el usuario vuelve a usar la app, esta sale de la hibernación y los trabajos, las alertas y las notificaciones se ejecutan de nuevo como de costumbre. Cualquier trabajo, alerta o notificación que se haya programado antes de que la app entrara en hibernación debe reprogramarse.

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

  • Si se modifica la definición de uso de la app o se introducen formas de activar una app que no están en AOSP, se puede interrumpir la precisión de la hibernación de la app.
  • El mecanismo de restricción patentado de un OEM, similar a la hibernación de apps, puede cumplir un propósito similar. Si bien ambos pueden existir, es posible que haya cierta superposición.

El CDD describe un nuevo conjunto de requisitos para los cambios basados en el uso de la app, similar al requisito existente 3.5.1. La hibernación de apps cumple con estos requisitos.

El código del framework se encuentra en la siguiente ubicación:

La lógica de la política se encuentra en los siguientes archivos:

  • repo: platform/packages/modules/Permission
  • directorio: PermissionController/src/com/android/permissioncontroller/hibernation

Arquitectura de alto nivel

El servicio del sistema de hibernación de apps optimiza las apps que un usuario no usa con frecuencia para el almacenamiento y evita que se ejecuten en segundo plano. Para lograr estos resultados, cuando hibernamos una app, hacemos lo siguiente específicamente:

  • Revocación automática de permisos
  • Fuerza la detención de la app
  • Borra los archivos ODEX y VDEX
  • Borra la caché de la app

Nuestro objetivo es implementar la hibernación como una acción reversible para que la app siga disponible para el usuario a través del Selector y otras plataformas con datos de la app intactos. Cuando se inicie la app, la restableceremos 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:

  • Cómo determinar cuándo debe hibernar un paquete
  • Cómo optimizar el paquete en hibernación

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

La determinación de cuándo debe hibernar un paquete se basa principalmente en UsageStatsService y se administra con AppHibernationJobService en PermissionController. Esta lógica de política se encuentra en PermissionController para permitirnos realizar actualizaciones dinámicas a través de Mainline. Además, planeamos agregar un nuevo indicador, 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 se producen todos los ahorros y las optimizaciones reales. AppHibernationService se comunica con varias partes del sistema para detener el paquete, borrar los datos de la caché, borrar los artefactos de ART, etcétera. 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 del usuario

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

Al igual que con la revocación automática, el usuario recibe una notificación sobre qué apps se hibernaron y tiene la opción de ir a la Configuración directamente desde la notificación para abrir la app y sacarla de la hibernación, o bien borrar la app sin usar si es necesario.

Seguimos admitiendo la intención del desarrollador de solicitar al usuario una exención de hibernación con la intención de exención de revocación automática de permisos existente.

Retrocompatibilidad

Las funciones específicas de hibernación están disponibles a partir de Android 12. Esta función no podía funcionar en versiones anteriores, ya que los componentes de la plataforma (como el nuevo servicio del sistema) no estaban presentes. La revocación automática sigue funcionando como se implementó para las versiones anteriores del SO.

A partir de Android 12, para garantizar la compatibilidad con versiones anteriores, se agrega un botón de activación de hibernación en la página de la app en Apps y notificaciones en Configuración, mientras que se mantiene el botón de activación de revocación automática original en el submenú Permisos. Este botón de activación controla la exención general del sistema de hibernación de apps para la app.

Personalización

Parte de la implementación es un componente modular del sistema, por lo que se recomienda a los socios que no modifiquen la función. En cambio, los socios pueden implementar funciones o características similares, siempre y cuando cumplan con los requisitos de la CDD.

La hibernación de apps debe estar ACTIVADA de forma predeterminada para todas las apps que se segmenten para Android 11 o versiones posteriores. Esto es lo mismo que la revocación automática de permisos. Si bien el parámetro de configuración puede estar ACTIVADO, la implementación de la hibernación de apps puede diferir entre las apps que segmentan Android 11 y Android 12. Más específicamente, la hibernación de apps solo funciona para las apps que se segmentan para Android 11, mientras que, para las apps que se segmentan para Android 12, es esencialmente solo la revocación automática.

Además, es posible que los OEM implementen una función similar. Sin embargo, esas funciones se orientan a un plazo mucho más corto para las optimizaciones de la batería, que pueden ser específicas del OEM. Cualquier función similar de restricción de apps que desarrollen los OEM puede coexistir con el sistema de hibernación de apps, siempre y cuando cumpla con los criterios existentes definidos en el CDD.

Prueba

La hibernación de apps tiene pruebas de CTS y de unidades para garantizar que funcione correctamente.