Task Snapshots es una infraestructura que se introdujo en Android 8.0 y que combina capturas de pantalla para Miniaturas recientes y Plataformas guardadas desde el Administrador de ventanas. Recientes Las miniaturas representan el último estado de una tarea en la vista Recientes.
Cuando una actividad pasaba a un estado de detención, el administrador de ventanas no destruía la superficies de la actividad siempre que esta haya estado en la parte superior de la tarea. Si esta actividad tuvo que mostrarse otra vez, Window Manager pudo iniciar el una animación sin esperar a que la actividad termine de dibujar su primer fotograma, como pudo usar esta superficie guardada.
Arquitectura
Los dos conceptos de Miniaturas recientes y Plataformas guardadas están unificados con Tareas Instantáneas Cuando una tarea pasa a segundo plano, Window Manager coloca una captura de pantalla de esta tarea en un GraphicBuffer. Siempre y cuando la aplicación de la parte superior actividad de la tarea permanece en la memoria, este GraphicBuffer se retendrá en memoria. Ahora, cuando la misma actividad vuelve al frente, Windows Manager creará una ventana de inicio (TaskSnapshotSurface) y adjuntará el GraphicBuffer sin copiar memoria en la cola de búfer del inicio en la ventana modal. Tan pronto como la actividad haya dibujado su primer fotograma, el resumen de la tarea la ventana de inicio se atenuará 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 en el dibujo. el estado de vista previa de una tarea en la vista Recientes. Ya que esto es solo una referencia a un búfer, el envío a través de Binder consume pocos recursos. Cuando GraphicBuffer llega a SystemUI, se une a un mapa de bits de hardware y, luego, dibujada en la pantalla sin que se suba ninguna memoria a la memoria de gráficos.
Beneficios
Esta nueva arquitectura presenta tres beneficios principales:
- Si la instantánea de la tarea se usa como ventana de inicio, hay un buen encadenado entre el resumen y el contenido real.
- Cuando se dibuja la instantánea de la tarea en SystemUI, se puede hacer sin ninguna copiar. Anteriormente, el mapa de bits tenía que copiarse en Ashmem y, luego, en los gráficos. memoria. Como este método almacena la instantánea directamente en la memoria gráfica, pero no se deben copiar.
- El estado que ves en Recientes siempre coincide con el estado que verás primero cuando volver a abrir la aplicación. Tener el mismo búfer aquí también ahorra mucha memoria. Por eso, Recientes ahora puede mostrar esas imágenes en resolución completa. Anteriormente, se redujo en un 64% para ahorrar memoria.
Implementación
Esta función solo existe en la plataforma de Android. No hay integración y la personalización no es compatible. Sin embargo, los fabricantes de dispositivos pueden inhabilitar por completo la función de Instantáneas de la tarea.
Para inhabilitar esta función, modifícala:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
Ten en cuenta que, si la función está deshabilitada, la vista Recientes no mostrará miniaturas.
Instantáneas en alta y baja resolución
Las instantáneas de tareas se escriben en el disco en dos escalas. Cuando restableces 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 las imágenes. De lo contrario, podría haber una pequeña demora cuando se lea el archivo de la instantánea desde el y el usuario vería una tarjeta de tareas en blanco hasta que la imagen estuviera disponible. Puedes configurar las balanzas en el archivo de configuración de superposición de dispositivos.overlay/frameworks/base/core/res/res/values/config.xml
estableciendo
config_highResTaskSnapshotScale
y
config_lowResTaskSnapshotScale
De forma predeterminada, estos valores se configuran como 1.0.
y 0.5, respectivamente. Inhabilita las instantáneas de baja resolución con la configuración
config_lowResTaskSnapshotScale
a 0.0.
Ejemplos y fuente
Encuentra el resto del código para esta función dentro de los archivos TaskSnapshot* en:
frameworks/base/+/main/services/core/java/com/android/server/wm/