Instantáneas de tareas

Task Snapshots es una infraestructura introducida en Android 8.0 que combina capturas de pantalla para miniaturas recientes y superficies guardadas del Administrador de ventanas. Recientes Miniaturas representan el último estado de una tarea en la vista Recientes.

Cuando una actividad entraba en un estado detenido, Window Manager no destruía las superficies de la actividad siempre que esa actividad estuviera en la parte superior de la tarea. Si esta actividad tenía que volver a mostrarse, el Administrador de ventanas podía iniciar la animación sin esperar a que la actividad terminara de dibujar su primer cuadro, ya que podía usar esta Superficie guardada.

Arquitectura

Los dos conceptos de Miniaturas recientes y Superficies guardadas se unifican con Instantáneas de tareas. Cuando una tarea pasa a segundo plano, Window Manager coloca una captura de pantalla de esta tarea en un GraphicBuffer. Mientras la aplicación de la actividad principal de la tarea permanezca en la memoria, este GraphicBuffer se mantendrá en la memoria. Ahora, cuando la misma actividad vuelva a aparecer, el Administrador de ventanas creará una ventana de inicio (TaskSnapshotSurface) y adjuntará el GraphicBuffer sin copiar ninguna memoria a la cola del búfer de la ventana de inicio. Tan pronto como la actividad haya dibujado su primer cuadro, la ventana de inicio de la instantánea de la tarea se desvanecerá suavemente como las pantallas de inicio normales.

El mismo GraphicBuffer también se envía a través de Binder a SystemUI para que se use para dibujar el estado de vista previa de una tarea en la vista Recientes. Dado que esto es solo una referencia a un búfer, enviarlo a través de un enlazador gasta pocos recursos. Cuando GraphicBuffer llega a SystemUI, se envuelve en un mapa de bits de hardware y luego se dibuja en la pantalla sin que se cargue ninguna memoria en la memoria gráfica.

Beneficios

Hay tres ventajas principales de esta nueva arquitectura:

  • Si la instantánea de la tarea se usa como ventana de inicio, hay un buen cruce entre la instantánea y el contenido real.
  • Cuando la instantánea de la tarea se dibuja en SystemUI, se puede hacer sin ninguna copia. Anteriormente, el mapa de bits tenía que copiarse en Ashmem y luego en la memoria gráfica. Dado que este método almacena la instantánea directamente en la memoria gráfica, no es necesario copiarla.
  • El estado que ve en Recientes siempre coincide con el estado que verá por primera vez al volver a abrir la aplicación. Tener el mismo búfer aquí también ahorra mucha memoria. Es por eso que Recents ahora puede mostrar estas imágenes en resolución completa. Anteriormente, se redujo la muestra en un 64 % para ahorrar memoria.

Implementación

Esta característica existe completamente en la plataforma Android. No se requiere integración y no se admite la personalización. Sin embargo, los fabricantes de dispositivos pueden deshabilitar la función Instantáneas de tareas por completo.

Para deshabilitar esta función, modifique esta función:

frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215

Tenga en cuenta que si la función está deshabilitada, la vista Recientes no mostrará ninguna miniatura.

Instantáneas de alta y baja resolución

Las instantáneas de tareas se escriben en el disco a dos escalas. Al restaurar una instantánea de tarea desde el disco, las instantáneas de baja resolución se leen primero y luego se reemplazan por sus contrapartes de alta resolución. Esta optimización mejora los tiempos de carga de imágenes. De lo contrario, podría haber un ligero retraso al leer el archivo de instantánea del disco y el usuario vería una tarjeta de tarea en blanco hasta que la imagen estuviera disponible. Puede configurar las escalas en el archivo de configuración de superposición de dispositivos overlay overlay/frameworks/base/core/res/res/values/config.xml configurando config_highResTaskSnapshotScale y config_lowResTaskSnapshotScale . De forma predeterminada, se establecen en 1,0 y 0,5 respectivamente. Deshabilite las instantáneas de baja resolución configurando config_lowResTaskSnapshotScale en 0.0.

Ejemplos y fuente

Encuentre el resto del código para esta característica dentro de los archivos TaskSnapshot* en:

frameworks/base/+/master/services/core/java/com/android/server/wm/