Instantanés de tâches

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 et les surfaces enregistrées ; dans le gestionnaire de fenêtres. Les vignettes récentes représentent le dernier état d'une tâche dans la vue "Récents".

Lorsqu'une activité passait à l'état "Arrêtée", le gestionnaire de fenêtres n'a pas détruit surfaces de l'activité tant que cette activité était au-dessus de la tâche. Si que cette activité devait s'afficher à nouveau, le gestionnaire de fenêtres a pu lancer sans attendre que l'activité ait fini de dessiner sa première image, il a pu utiliser cette surface enregistrée.

Architecture

Les deux concepts de vignettes récentes et de surfaces enregistrées sont unifiés dans l'onglet "Tâches" Instantanés. Lorsqu'une tâche passe en arrière-plan, le gestionnaire de fenêtres place une capture d'écran de cette tâche dans un GraphicBuffer. Tant que l'application du haut activité de la tâche reste en mémoire, ce GraphicBuffer sera conservé dans mémoire. Maintenant, lorsque la même activité est de nouveau au premier plan, Manager crée une fenêtre de démarrage (TaskSnapshotSurface) et lui associe GraphicBuffer sans copier de mémoire dans la file d'attente de la VM de démarrage fenêtre. Dès que le premier frame de l'activité est dessiné, l'instantané de la tâche la fenêtre de démarrage disparaît progressivement 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 "Recents" (Éléments récents). Puisqu'il ne s'agit que d'une référence dans un tampon, son envoi via la liaison consomme peu de ressources. Lorsque GraphicBuffer arrive à SystemUI, il est encapsulé dans un bitmap matériel, puis dessinées à l'écran sans aucune importation de mémoire dans 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épart, un fondu enchaîné intéressant entre l'instantané et le contenu réel.
  • Lorsque l'instantané de la tâche est dessiné dans SystemUI, il est possible de le faire copier. Auparavant, il fallait copier le bitmap dans Ashmem, puis dans les graphiques. mémoire. Étant donné que cette méthode stocke l'instantané directement dans la mémoire graphique, aucune une copie est nécessaire.
  • L'état que vous voyez dans "Récents" correspond toujours à l'état que vous verrez en premier lorsque rouvrir l'application. Avoir le même tampon ici permet également d'économiser beaucoup de mémoire. C'est pourquoi l'application Récents est désormais en mesure d'afficher ces images en haute résolution. Auparavant, il était réduit de 64% pour économiser de la mémoire.

Implémentation

Cette fonctionnalité est entièrement disponible dans la plate-forme Android. Aucune intégration n'est requise, et la personnalisation n'est pas prise en charge. Toutefois, les fabricants d'appareils peuvent désactiver entièrement la fonctionnalité Instantanés de tâches.

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

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'affiche vos miniatures.

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'une tâche du disque, les instantanés basse résolution sont lus en premier, puis remplacés par par rapport à leur homologue haute résolution. Cette optimisation permet de réduire les temps de chargement des images. Sinon, il peut y avoir un léger retard lors de la lecture du fichier d'instantané à partir de disque, et l'utilisateur verrait une carte de tâche vide jusqu'à ce que l'image soit disponible. Vous pouvez configurer les balances dans le fichier de configuration de superposition de l'appareil overlay/frameworks/base/core/res/res/values/config.xml par paramètre config_highResTaskSnapshotScale et config_lowResTaskSnapshotScale Par défaut, cette valeur est définie sur 1.0 et 0,5 respectivement. Désactivez les instantanés basse résolution en définissant config_lowResTaskSnapshotScale sur 0,0.

Exemples et source

Retrouvez le reste du code pour cette fonctionnalité dans les fichiers TaskSnapshot* dans:

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