ViewCapture est un outil logiciel qui capture les propriétés des vues (telles que l'emplacement, la taille, l'échelle et la visibilité) associées aux fenêtres auxquelles il est rattaché. ViewCapture capture des informations sur les différentes vues d'une fenêtre et leurs propriétés. Vous pouvez ainsi connaître l'état de l'expérience utilisateur à des moments précis et suivre les changements au fil du temps.
Les enregistrements d'écran peuvent visualiser l'état d'une vue à un moment précis et montrer comment elle évolue, mais ils nécessitent des ressources CPU importantes et peuvent avoir un impact sur les performances. L'outil ViewCapture a un impact moindre sur les ressources et peut être activé plus fréquemment. De plus, ViewCapture affiche les visualisations image par image au niveau de la vue, ce qui permet d'inspecter plus facilement l'état de la vue à des moments spécifiques par rapport aux enregistrements d'écran.
Cette page explique comment intégrer ViewCapture dans les applications système.
Utiliser
ViewCapture.java implémente une instance de onDrawListener et collecte une trace ViewCapture pendant le processus de dessin. Chaque redessin de frame déclenche une traversée de la hiérarchie de l'arborescence des vues, en commençant par la vue racine de la fenêtre.
ViewCapture utilise des méthodes getter publiques View.java pour extraire et copier les valeurs dans un thread d'arrière-plan afin d'améliorer les performances. L'implémentation ViewCapture optimise ce processus en vérifiant si une vue est "sale" ou invalidée à l'aide de captureViewTree, ce qui évite de parcourir l'intégralité de la hiérarchie des vues. captureViewTree n'est disponible que pour les applications système et fait partie de l'API UnsupportedAppUsage.
L'utilisation de cette API est limitée aux applications en fonction de leur version SDK cible.
Limites
Cette section décrit les limites de performances et de mémoire de ViewCapture.
Performances
La surcharge moyenne du thread principal pour les performances ViewCapture est de 195 μs. Toutefois, dans le pire des cas, cela peut prendre environ 5 ms. Reportez-vous à la tranche vc#onDraw dans la trace Perfetto.
Les frais généraux sont principalement dus aux actions suivantes :
- Le parcours de la hiérarchie coûte 50 μs, même lorsqu'elle est élaguée.
- L'extraction d'objets à partir d'un allocateur de liste libre pour stocker des copies des propriétés de vue coûte 20 μs.
- L'extraction de chaque valeur de propriété via une fonction getter entraîne de nombreux appels de fonction supplémentaires par vue, ce qui coûte 110 μs.
Par conséquent, l'activation de ViewCapture dans le traçage AOT (Always-On Tracing) a un impact négatif sur les performances du système et entraîne des saccades. En raison de ces limitations de performances et de mémoire, cette approche n'est pas prête pour l'AOT. Nous recommandons ViewCapture uniquement pour le débogage en laboratoire et local.
Mémoire
La méthode de Perfetto pour les traces ViewCapture utilise une seule mémoire tampon circulaire avec une empreinte mémoire prédéfinie pour éviter une utilisation excessive de la mémoire. Cette approche évite une consommation excessive de mémoire en évitant les tampons de sonnerie distincts pour chaque fenêtre. Toutefois, cela ne résout pas le problème du stockage de l'intégralité de la hiérarchie des vues pour chaque état dans Perfetto pour chaque frame. L'enregistrement d'une seule fenêtre, telle que NexusLauncher, peut générer plus de 30 secondes de données ViewCapture dans un tampon de 10 Mo. Pour capturer plus de 30 fenêtres de l'interface utilisateur du système, vous avez besoin d'un tampon plus grand ou d'une durée d'enregistrement considérablement plus courte.
Instructions
Pour intégrer ViewCapture dans les applications système, suivez ces instructions :
- Ajoutez la dépendance à votre fichier - Android.bp, comme indiqué dans le code du lanceur d'applications.- android_library { name: "YourLib", static_libs: [ ... "//frameworks/libs/systemui:view_capture", ... ], platform_apis: true, privileged: true, }
- Créez une instance ViewCapture lorsque vous créez votre fenêtre, par exemple : - 
private SafeCloseable mViewCapture; @Override protected void onCreate(Bundle savedInstanceState) { ... mViewCapture = ViewCaptureFactory.getInstance(this).startCapture(getWindow()); }
- 
private SafeCloseable mViewCapture; @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); if (enableViewCaptureTracing()) { mViewCaptureCloseable = ViewCaptureFactory.getInstance(getContext()) .startCapture(getRootView(), ".NotificationShadeWindowView"); } ... }
 
- 
- Fermez l'instance ViewCapture lorsque vous détruisez votre fenêtre, comme indiqué dans les exemples suivants :