Les instantanés de tâche sont une infrastructure introduite dans Android 8.0 qui combine les captures d'écran pour les miniatures récentes et les surfaces enregistrées du gestionnaire de fenêtres. Les vignettes récentes représentent le dernier état d'une tâche dans la vue "Recents" (Éléments récents).
Lorsqu'une activité passait à l'état "arrêtée", le gestionnaire de fenêtres ne détruisait pas les surfaces de l'activité tant qu'elle se trouvait en haut de la tâche. Si cette activité devait être affichée à nouveau, le gestionnaire de fenêtres pouvait démarrer l'animation sans attendre que l'activité ait terminé de dessiner son premier frame, car il pouvait utiliser cette surface enregistrée.
Architecture
Les deux concepts des miniatures récentes et des surfaces enregistrées sont unifiés avec les instantanés de tâche. 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 de l'activité principale de la tâche reste en mémoire, ce GraphicBuffer est conservé en mémoire. Désormais, lorsque la même activité est de nouveau mise en avant, WindowManager crée une fenêtre de démarrage (TaskSnapshotSurface) et associe le GraphicBuffer sans copier de mémoire dans la file d'attente de tampon de la fenêtre de démarrage. Dès que l'activité a dessiné son premier frame, la fenêtre de démarrage de l'instantané de tâche s'estompe progressivement, comme les écrans de démarrage standards.
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". Comme il ne s'agit que d'une référence à un tampon, l'envoyer via le liaison consomme peu de ressources. Lorsque le GraphicBuffer arrive dans SystemUI, il est encapsulé dans un bitmap matériel, puis dessiné à l'écran sans aucun chargement de mémoire dans la mémoire graphique.
Avantages
Cette nouvelle architecture présente trois principaux avantages:
- Si l'instantané de la tâche est utilisé comme fenêtre de démarrage, un fondu croisé s'effectue entre l'instantané et le contenu réel.
- Lorsque l'instantané de la tâche est dessiné dans SystemUI, cela peut se faire sans aucune copie. Auparavant, le bitmap devait être copié dans Ashmem, puis dans la mémoire graphique. Étant donné que cette méthode stocke l'instantané directement dans la mémoire graphique, aucune copie n'est nécessaire.
- L'état affiché dans "Récents" correspond toujours à celui que vous verrez pour la première fois lorsque vous rouvrirez l'application. Le fait d'utiliser le même tampon permet également d'économiser beaucoup de mémoire. C'est pourquoi les images récentes peuvent désormais s'afficher en haute résolution. Auparavant, il était réduit de 64% pour économiser de la mémoire.
Implémentation
Cette fonctionnalité existe entièrement 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 complètement la fonctionnalité Instantanés de tâche.
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, aucune vignette ne s'affiche dans la vue "Récents".
Instantanés haute résolution et basse résolution
Les instantanés de tâche sont écrits sur le disque à deux échelles. Lorsque vous restaurez un instantané de tâche à partir du disque, les instantanés basse résolution sont lus en premier, puis remplacés par leur équivalent 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 fiche de tâche vide jusqu'à ce que l'image soit disponible. Vous pouvez configurer les échelles dans le fichier de configuration de la superposition de l'appareiloverlay/frameworks/base/core/res/res/values/config.xml
en définissant config_highResTaskSnapshotScale
et config_lowResTaskSnapshotScale
. Par défaut, ces valeurs sont définies 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
Vous trouverez le reste du code de cette fonctionnalité dans les fichiers TaskSnapshot* dans:
frameworks/base/+/main/services/core/java/com/android/server/wm/