Recherche de trace

Utilisez SQL pour trouver des états spécifiques dans les traces Winscope Perfetto. Utilisez le lecteur Search global dans l'UI Winscope pour exécuter des requêtes et visualiser les résultats tabulés :

Onglet "Lecteur de recherche"

Figure 1 : Onglet "Rechercher dans la visionneuse".

Le lecteur Search (Rechercher) vous permet d'écrire et d'exécuter des requêtes SQL personnalisées sur les traces Perfetto, ainsi que d'accéder aux requêtes récentes et enregistrées. Winscope fournit des vues SQL spécialisées pour faciliter la recherche dans les traces SurfaceFlinger, Transactions, Transitions et ViewCapture.

Utilisez les conventions suivantes pour toutes les vues :

  • Pour les colonnes property et flat_property :

    • Les noms de propriétés sont en snake case, par exemple visible_region à partir de LayerProto.
    • La notation par points représente les propriétés imbriquées, par exemple visible_region.rect.

    • Les champs répétés dans property sont indiqués par des crochets :

      Par exemple, dans deux instances du champ répété visible_region.rect, le champ top est représenté par visible_region.rect[0].top et visible_region.rect[1].top.

    • Les champs répétés dans flat_property sont indiscernables :

      Par exemple, dans deux instances du champ répété visible_region.rect, le champ top est représenté par visible_region.rect.top dans les deux instances.

  • Pour les colonnes value et previous_value, les valeurs booléennes sont représentées par 0 (False) ou 1 (True).

Winscope crée ces vues en joignant les données des tables spécifiques aux traces à la table args Perfetto. Vous pouvez interroger directement ces tables. Dans la table args, les colonnes key, flat_key et display_value sont analogues aux colonnes de vue property, flat_property et value, respectivement.

Tableau args :

Colonne Description
arg_set_id Permet d'associer un ensemble d'arguments
flat_key Nom de la propriété du message proto, sans tenir compte des champs répétés
key Nom de la propriété à partir du message proto, en tenant compte des champs répétés
value_type Type de valeur de propriété
int_value Valeur de la propriété si le type de valeur est un entier
string_value Valeur de la propriété si le type de valeur est une chaîne
real_value Valeur de la propriété si le type de valeur est réel
display_value Valeur de propriété convertie en chaîne

Vues SQL SurfaceFlinger

Les données proto SurfaceFlinger utilisent les formats suivants :

Pour rechercher des données de calque, utilisez la vue sf_layer_search. Cette vue inclut les colonnes suivantes :

Colonne Description
state_id ID de la ligne de l'entrée à laquelle appartient le calque
ts Code temporel de l'entrée à laquelle appartient le calque
layer_id ID du calque
parent_id ID du calque parent
layer_name Nom de la couche
property Nom de propriété tenant compte des champs répétés
flat_property Nom de propriété ne tenant pas compte des champs répétés
value Valeur de la propriété au format chaîne
previous_value Valeur de la propriété de l'entrée précédente au format chaîne

Pour rechercher des données racine de hiérarchie, utilisez la vue sf_hierarchy_root_search. Cette vue inclut les colonnes suivantes :

Colonne Description
state_id ID de ligne de l'entrée
ts Code temporel de l'entrée
property Nom de propriété tenant compte des champs répétés
flat_property Nom de propriété ne tenant pas compte des champs répétés
value Valeur de la propriété au format chaîne
previous_value Valeur de la propriété de l'entrée précédente au format chaîne

Exemples de requêtes

  • Recherchez toutes les frames où le calque IME a des limites d'écran valides :

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'IME%'
      AND property='screen_bounds.bottom'
      AND value<='24000'
    
  • Trouvez toutes les images où la couche Taskbar color.a (alpha) change :

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name like 'Taskbar%'
      AND property='color.a'
      AND value!=previous_value
    
  • Trouve tous les cadres dont la limite inférieure de Wallpaper est inférieure ou égale à 2400 :

    SELECT ts, value, previous_value FROM sf_layer_search
      WHERE layer_name LIKE 'Wallpaper%'
      AND property='bounds.bottom'
      AND cast_int!(value) <= 2400
    
  • Affichez toutes les propriétés des écrans avec une pile de calques valide :

    SELECT STATE.* FROM sf_hierarchy_root_search STATE_WITH_DISPLAY_ON
    INNER JOIN sf_hierarchy_root_search STATE
      ON STATE.state_id = STATE_WITH_DISPLAY_ON.state_id
      AND STATE_WITH_DISPLAY_ON.flat_property='displays.layer_stack'
      AND STATE_WITH_DISPLAY_ON.value!='4294967295'
      AND STATE.property LIKE CONCAT(
        SUBSTRING(
            STATE_WITH_DISPLAY_ON.property,
            0,
            instr(STATE_WITH_DISPLAY_ON.property, ']')
        ),
        '%'
      )
    
  • Rechercher toutes les frames où le geste de balayage vers l'arrière est visible

    SELECT DISTINCT STATE.ts FROM sf_layer_search STATE
      WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
    

Tables de données

Les vues SurfaceFlinger sont créées à l'aide des tables sous-jacentes suivantes.

surfaceflinger_layers_snapshot :

Colonne Description
id ID de ligne de l'entrée
ts Code temporel de l'entrée
arg_set_id ID utilisé pour associer les lignes de la table args à cette entrée

surfaceflinger_layer :

Colonne Description
id ID de ligne du calque
snapshot_id ID de ligne de l'entrée de surfaceflinger_layers_snapshot à laquelle appartient le calque
arg_set_id ID utilisé pour associer les lignes de la table args à ce calque

Vue SQL des transactions

Les données proto des transactions utilisent le format TransactionTraceEntry.

Pour rechercher des données de trace de transactions, utilisez la vue transactions_search. Cette vue inclut les colonnes suivantes :

Colonne Description
state_id ID de la ligne de l'entrée à laquelle appartient la propriété proto
ts Code temporel de l'entrée à laquelle appartient la propriété proto
transaction_id ID de la transaction (si disponible)
property Nom de propriété tenant compte des champs répétés
flat_property Nom de propriété ne tenant pas compte des champs répétés
value Valeur de la propriété au format chaîne

Exemples de requêtes

  • Recherchez le frame où une transaction a été appliquée pour modifier la position X du calque sur -54.0 :

    SELECT ts, transaction_id, value FROM transactions_search
      WHERE flat_property='transactions.layer_changes.x'
      AND value='-54.0'
    
  • Recherchez le frame dans lequel le calque ImeContainer a été ajouté :

    SELECT ts FROM transactions_search
      WHERE flat_property='added_layers.name'
      AND value='ImeContainer'
    

Tables de données

La vue SQL "Transactions" est créée à l'aide des tables sous-jacentes suivantes.

surfaceflinger_transactions :

Colonne Description
id ID de ligne de l'entrée
ts Code temporel de l'entrée
arg_set_id ID utilisé pour associer les lignes de la table args à cette entrée
vsync_id ID VSync associé à toutes les transactions de cette entrée

android_surfaceflinger_transaction :

Colonne Description
id ID de ligne pour la transaction
snapshot_id ID de la ligne de l'entrée de surfaceflinger_transactions à laquelle appartient la transaction
arg_set_id ID utilisé pour associer les lignes de la table args à cette transaction
transaction_id ID de transaction extrait du message proto
pid PID de la transaction extrait du message proto
uid UID de la transaction extrait du message proto
layer_id ID du calque associé à la transaction, le cas échéant
display_id ID de l'écran associé à la transaction, le cas échéant
flags_id ID utilisé pour récupérer les indicateurs associés à partir de android_surfaceflinger_transaction_flag
transaction_type Type de transaction

android_surfaceflinger_transaction_flag :

Colonne Description
flags_id Correspond à la valeur d'une ligne dans android_surfaceflinger_transaction
flag Chaîne d'indicateur traduite

Les transactions individuelles sont ajoutées au tableau des arguments à partir de différents formats de messages proto en fonction de leur type de transaction :

  • LAYER_ADDED : format LayerCreationArgs
  • LAYER_CHANGED : format LayerState
  • DISPLAY_ADDED : format DisplayState
  • DISPLAY_CHANGED : format DisplayState
  • LAYER_DESTROYED : aucun argument
  • LAYER_HANDLE_DESTROYED : aucun argument
  • DISPLAY_REMOVED : aucun argument
  • NOOP : aucun argument

Vue SQL des transitions

Les données proto de transitions utilisent le format ShellTransition.

Pour rechercher des données sur les transitions, utilisez la vue transitions_search. Cette vue inclut les colonnes suivantes :

Colonne Description
ts Heure d'envoi. Si elle est disponible, l'heure d'envoi est utilisée. Sinon, la valeur 0 est utilisée.
transition_id ID de transition extrait du message proto
property Nom de propriété tenant compte des champs répétés
flat_property Nom de propriété ne tenant pas compte des champs répétés
value UID de la transaction extrait du message proto

Exemples de requêtes

Recherchez les propriétés des transitions gérées par DefaultMixedHandler :

  SELECT
    PROPS.ts,
    PROPS.transition_id,
    PROPS.property,
    PROPS.value
  FROM transitions_search HANDLER_MATCH
  INNER JOIN transitions_search PROPS
    ON HANDLER_MATCH.transition_id = PROPS.transition_id
  WHERE HANDLER_MATCH.property = 'handler'
    AND HANDLER_MATCH.value LIKE "%DefaultMixedHandler"
  ORDER BY PROPS.transition_id, PROPS.property

Tables de données

La vue "Transitions" est créée à l'aide des tables sous-jacentes suivantes.

window_manager_shell_transitions :

Colonne Description
id ID de ligne pour la transition
ts Heure d'envoi. Si elle est disponible, l'heure d'envoi est utilisée. Sinon, la valeur 0 est utilisée.
transition_id ID de transition extrait du message proto
arg_set_id ID utilisé pour associer les lignes de la table args à cette transition
transition_type Type de transition extrait du message proto
send_time_ns Temps d'envoi de la transition extrait du message proto
dispatch_time_ns Heure d'envoi de la transition extraite du message proto
duration_ns Durée de la transition, si les heures de début et de fin sont disponibles
handler Gestionnaire de transition : récupérer la traduction depuis window_manager_shell_transition_handlers
status État de la transition : played, merged ou aborted
flags Indicateurs de transition extraits du message proto

window_manager_shell_transition_handlers :

Colonne Description
handler_id ID correspondant à la valeur de la colonne handler de window_manager_shell_transitions
handler_name Traduction de chaînes

android_window_manager_shell_transition_participants :

Colonne Description
transition_id ID de transition extrait du message proto brut
layer_id ID du participant au calque SurfaceFlinger
window_id ID du participant au conteneur WindowManager

Vue SQL ViewCapture

Les données proto ViewCapture utilisent le format View.

Pour rechercher des données ViewCapture, utilisez la vue viewcapture_search. Cette vue inclut les colonnes suivantes :

Colonne Description
state_id ID de ligne de l'état auquel appartient la vue
ts Code temporel de l'état auquel la vue appartient
package_name Nom du package
window_name Nom de la fenêtre
class_name Afficher le nom du cours
property Nom de propriété tenant compte des champs répétés
flat_property Nom de propriété ne tenant pas compte des champs répétés
value Valeur de la propriété au format chaîne
previous_value Valeur de la propriété à partir de l'état précédent au format chaîne

Exemples de requêtes

Recherchez tous les états lorsque SearchContainerView se déplace dans la direction y :

  SELECT * FROM viewcapture_search
  WHERE class_name LIKE '%SearchContainerView'
    AND flat_property='translation_y'
    AND value!=previous_value

Tables de données

La vue ViewCapture est créée à l'aide des tables sous-jacentes suivantes.

android_viewcapture :

Colonne Description
id ID de ligne de l'entrée
ts Code temporel de l'entrée
arg_set_id ID utilisé pour associer les lignes de la table args à cette entrée

android_viewcapture_view :

Colonne Description
id ID de ligne de la vue
snapshot_id ID de ligne de l'entrée de android_viewcapture à laquelle appartient la vue
arg_set_id ID utilisé pour associer les lignes de la table args à cette vue

Table SQL ProtoLog

Les données proto ProtoLog utilisent le format ProtoLogMessage. Cette vue inclut les colonnes suivantes :

Colonne Description
ts Code temporel du journal
level Niveau de journalisation
tag Tag de groupe de journalisation
message Message de journal
stacktrace Trace de la pile (si disponible)
location Emplacement du code d'où provient le message

Exemples de requêtes

  • Rechercher tous les journaux dont le message contient transition :

    SELECT ts, message, location FROM protolog
      WHERE message LIKE '%transition%'
    
  • Recherchez tous les journaux contenant des ID de transaction valides :

    CREATE PERFETTO VIEW valid_tx_ids AS
      SELECT DISTINCT transaction_id FROM transactions_search
      WHERE transaction_id IS NOT NULL AND transaction_id != '0';
    
    SELECT TRANS.transaction_id, message FROM valid_tx_ids TRANS
    INNER JOIN protolog LOGS
      ON LOGS.message LIKE CONCAT('%', TRANS.transaction_id, '%');
    

Exécuter des requêtes

Vous pouvez exécuter des requêtes de recherche à l'aide du panneau RECHERCHE GLOBALE à gauche de la visionneuse Recherche.

Lorsque vous interagissez pour la première fois avec le panneau RECHERCHE GLOBALE, la recherche de trace s'initialise et Winscope crée les vues SQL d'assistance. Cette opération prend quelques secondes. La timeline n'est pas disponible pendant l'initialisation de la recherche de trace.

Pour lancer une requête, saisissez-la dans le champ de recherche, puis cliquez sur Exécuter la requête de recherche ou appuyez sur la touche Entrée de votre clavier.

Une fois l'opération terminée, le tableau des résultats s'affiche dans le panneau central. Votre requête s'affiche sous le champ de recherche, avec un champ permettant d'enregistrer la requête entre les sessions.

Pour accéder aux requêtes enregistrées, cliquez sur l'onglet Enregistrements dans le panneau de gauche. Pour accéder aux requêtes récemment exécutées, cliquez sur l'onglet Récentes :

panneau de gauche du lecteur de recherche

Figure 2. Panneau de gauche du lecteur de recherche.

Résultats

Toutes les requêtes renvoient des résultats tabulés, affichés dans une vue à défilement avec un comportement interactif semblable à celui des traceurs basés sur les journaux, tels que Transactions et ProtoLog :

Résultats de recherche des spectateurs

Figure 3. Résultats de la visionneuse de recherche.

Si le tableau obtenu contient une colonne ts, les valeurs de cette colonne sont interprétées comme des codes temporels et ajoutées à la superposition de la timeline sous forme de nouvelle ligne d'entrées. Cliquez sur cette ligne et utilisez les touches fléchées gauche et droite pour naviguer entre les entrées :

chronologie des recherches

Figure 4. Chronologie de recherche.