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 desde el Administrador de ventanas. Las miniaturas recientes representan el último estado de una tarea en la vista Recientes.

Cuando una actividad entraba en estado detenido, el Administrador de ventanas no destruía las superficies de la actividad siempre que esa actividad estuviera en la parte superior de la tarea. Si esta actividad debía mostrarse nuevamente, 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 están unificados con Instantáneas de tareas. Cuando una tarea pasa a segundo plano, el Administrador de ventanas 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 conservará en la memoria. Ahora, cuando la misma actividad vuelva al frente, Window Manager creará una ventana de inicio (TaskSnapshotSurface) y adjuntará 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 fotograma, la ventana de inicio de Instantánea de tarea se desvanecerá suavemente como las pantallas de presentación normales.

El mismo GraphicBuffer también se envía a través de Binder a SystemUI para usarlo 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 una carpeta consume 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 de gráficos.

Beneficios

Esta nueva arquitectura tiene tres beneficios principales:

  • Si la instantánea de la tarea se utiliza como ventana de inicio, hay un agradable fundido entre la instantánea y el contenido real.
  • Cuando la instantánea de la tarea se dibuja en SystemUI, se puede hacer sin necesidad de copiarla. 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 ves en Recientes siempre coincide con el estado que verás 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 el muestreo 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 desactivar por completo la función Instantáneas de tareas.

Para desactivar esta característica, 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á desactivada, 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 en dos escalas. Al restaurar una instantánea de una tarea desde el disco, las instantáneas de baja resolución se leen primero y luego se reemplazan por su contraparte 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 del dispositivo overlay/frameworks/base/core/res/res/values/config.xml configurando config_highResTaskSnapshotScale y config_lowResTaskSnapshotScale . De forma predeterminada, están configurados 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 función en los archivos TaskSnapshot* en:

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