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 :
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
etflat_property
:- Les noms de propriétés sont en snake case, par exemple
visible_region
à partir deLayerProto
. 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 champtop
est représenté parvisible_region.rect[0].top
etvisible_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 champtop
est représenté parvisible_region.rect.top
dans les deux instances.
- Les noms de propriétés sont en snake case, par exemple
Pour les colonnes
value
etprevious_value
, les valeurs booléennes sont représentées par0
(False
) ou1
(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 :
Les données de la couche sont au format
LayerProto
.Les données racine de la hiérarchie sont au format
LayersSnapshotProto
.
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
: formatLayerCreationArgs
LAYER_CHANGED
: formatLayerState
DISPLAY_ADDED
: formatDisplayState
DISPLAY_CHANGED
: formatDisplayState
LAYER_DESTROYED
: aucun argumentLAYER_HANDLE_DESTROYED
: aucun argumentDISPLAY_REMOVED
: aucun argumentNOOP
: 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 :
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 :
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 :
Figure 4. Chronologie de recherche.