Hibernación de apps

Un usuario promedio de Android instala más de 50 apps en sus dispositivos (el número aumenta a medida que aumenta el nivel de RAM de los dispositivos). Sin embargo, una cantidad significativa de estas apps no son usadas por el usuario 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 fuerza la detención de la app 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 en este estado y comparte la misma configuración de exención en Configuración. Una app detenida por la fuerza 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 vuelven a ejecutarse como de costumbre. Se deben volver a programar los trabajos, las alertas y las notificaciones que se programaron antes de que la app entrara en hibernación.

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

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

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

El código del framework se encuentra en:

La lógica de políticas se encuentra en:

  • repo: platform/packages/modules/Permission
  • directory: 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 usa con poca frecuencia para el almacenamiento y evita que esas apps se ejecuten en segundo plano. Para lograr estos resultados, cuando ponemos a hibernar una app, hacemos lo siguiente:

  • Revocamos automáticamente los permisos.
  • Forzamos la detención de la app.
  • Borramos los archivos ODEX y VDEX.
  • Borramos la caché de la app.

Nuestro objetivo es implementar la hibernación como una acción reversible para que la app siga estando disponible para el usuario a través de Launcher y otras superficies con los 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:

  • Determinar cuándo debe hibernar un paquete
  • Optimizar el paquete de hibernación

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

La determinación de cuándo debe hibernar un paquete se basa principalmente en UsageStatsService y se administra con AppHibernationJobServiceen PermissionController. Esta lógica de políticas se encuentra en PermissionControllerpara permitirnos actualizar de forma dinámica 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 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 poner a hibernar.

Al igual que con la revocación automática, el usuario recibe una notificación sobre qué apps están en hibernación y tiene la opción de ir a Configuración directamente desde la notificación para abrir la app y sacarla de la hibernación o 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 están 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 retrocompatibilidad, se agrega un botón de activación o desactivación de hibernación en la página de la app en Apps y notificaciones en Configuración mientras se mantiene el botón de activación o desactivación de revocación automática original en el submenú Permisos. Este botón de activación o desactivación controla la exención general del sistema de hibernación de apps para la app.

Personalización

Parte de la implementación forma parte del componente modular del sistema, por lo que no se recomienda que los socios modifiquen la función. En su lugar, los socios pueden implementar funciones o funcionalidades similares, siempre que cumplan con los requisitos del CDD.

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

Además, es posible que los OEMs implementen una función similar. Sin embargo, esas funciones están orientadas a un período 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 desarrollada por los OEMs puede coexistir con el sistema de hibernación de apps siempre que cumpla con los criterios existentes definidos en el CDD.

Prueba

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