Instantanés de tâche

Les instantanés de tâches sont une infrastructure introduite dans Android 8.0 qui combine des captures d'écran pour les vignettes récentes ainsi que les surfaces enregistrées à partir du gestionnaire de fenêtres. Les miniatures récentes représentent le dernier état d'une tâche dans la vue Récents.

Lorsqu'une activité passait à l'état arrêté, Window Manager ne détruisait pas les surfaces de l'activité tant que cette activité se trouvait en haut de la tâche. Si cette activité devait être affichée à nouveau, Window Manager était en mesure de démarrer l'animation sans attendre que l'activité ait fini de dessiner sa première image, car il a pu utiliser cette surface enregistrée.

Architecture

Les deux concepts de vignettes récentes et de surfaces enregistrées sont unifiés avec les instantanés de tâches. Lorsqu'une tâche passe en arrière-plan, Window Manager place une capture d'écran de cette tâche dans un GraphicBuffer. Tant que l'application de l'activité principale de la tâche reste en mémoire, ce GraphicBuffer sera conservé en mémoire. Désormais, lorsque la même activité revient au premier plan, Window Manager créera une fenêtre de démarrage (TaskSnapshotSurface) et attachera le GraphicBuffer sans copier de mémoire dans la file d'attente des tampons de la fenêtre de démarrage. Dès que l'activité a dessiné sa première image, la fenêtre de démarrage de l'instantané de tâche disparaîtra doucement comme les écrans de démarrage classiques.

Le même GraphicBuffer est également envoyé via Binder à SystemUI pour être utilisé pour dessiner l'état d'aperçu d'une tâche dans la vue Récents. Puisqu'il ne s'agit que d'une référence à un tampon, son envoi via un classeur consomme peu de ressources. Lorsque le GraphicBuffer arrive à SystemUI, il est enveloppé dans un Bitmap matériel puis dessiné sur l'écran sans aucun téléchargement de mémoire vers la mémoire graphique.

Avantages

Cette nouvelle architecture présente trois avantages principaux :

  • Si l'instantané de la tâche est utilisé comme fenêtre de démarrage, il y a un joli fondu enchaîné entre l'instantané et le contenu réel.
  • Lorsque l'instantané de la tâche est dessiné dans SystemUI, cela peut être fait sans aucune copie. Auparavant, le bitmap devait être copié dans Ashmem, puis dans la mémoire graphique. Puisque cette méthode stocke l’instantané directement dans la mémoire graphique, aucune copie n’est nécessaire.
  • L'état que vous voyez dans Récents correspond toujours à l'état que vous verrez en premier lors de la réouverture de l'application. Avoir le même tampon ici permet également d'économiser beaucoup de mémoire. C'est pourquoi Récents est désormais capable d'afficher ces images en pleine résolution. Auparavant, il était sous-échantillonné de 64 % pour économiser de la mémoire.

Mise en œuvre

Cette fonctionnalité existe entièrement dans la plateforme Android. Aucune intégration n'est requise et la personnalisation n'est pas prise en charge. Les fabricants d'appareils peuvent toutefois désactiver complètement la fonctionnalité Instantanés de tâches.

Pour désactiver cette fonctionnalité, modifiez cette fonction :

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

Notez que si la fonctionnalité est désactivée, la vue Récents n'affichera aucune vignette.

Instantanés haute et basse résolution

Les instantanés de tâches sont écrits sur le disque à deux échelles. Lors de la restauration d'un instantané de tâche à partir du disque, les instantanés basse résolution sont d'abord lus, puis remplacés par leur homologue haute résolution. Cette optimisation améliore les temps de chargement des images. Sinon, il pourrait y avoir un léger retard lors de la lecture du fichier d'instantané à partir du disque et l'utilisateur verrait une carte de tâche vierge jusqu'à ce que l'image soit disponible. Vous pouvez configurer les échelles dans le fichier de configuration de superposition de périphériques overlay/frameworks/base/core/res/res/values/config.xml en définissant config_highResTaskSnapshotScale et config_lowResTaskSnapshotScale . Par défaut, ceux-ci sont respectivement définis sur 1,0 et 0,5. Désactivez les instantanés basse résolution en définissant config_lowResTaskSnapshotScale sur 0,0.

Exemples et source

Recherchez le reste du code de cette fonctionnalité dans les fichiers TaskSnapshot* dans :

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