Utilisez SQL pour trouver des états spécifiques dans les traces Winscope Perfetto. Utilisez le visualiseur Recherche global dans l'interface utilisateur Winscope pour exécuter des requêtes et visualiser les résultats tabulés:
Figure 1 : Onglet "Visionneuse de recherche".
L'outil de visualisation de la recherche vous permet d'écrire et d'exécuter des requêtes SQL personnalisées sur les traces Perfetto, et d'accéder aux requêtes récentes et enregistrées. Winscope fournit des vues SQL spécialisées pour faciliter la recherche de traces SurfaceFlinger et de transactions.
Utilisez les conventions suivantes pour toutes les vues:
Pour les colonnes
property
etflat_property
:- Les noms de propriété sont en casse snake, par exemple
visible_region
à partir deLayerProto
. Une notation par points est utilisée pour représenter des propriétés imbriquées, par exemple
visible_region.rect
.Les champs répétés dans
property
sont distingué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é sont en casse snake, par exemple
Pour les colonnes
value
etprevious_value
:- Les valeurs booléennes sont représentées par
'0'
(False
) ou'1'
(True
).
- Les valeurs booléennes sont représentées par
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 comprend les colonnes suivantes:
Colonne | Description |
---|---|
state_id |
Identifiant unique de l'entrée à laquelle appartient le calque |
ts |
Code temporel de l'entrée à laquelle la couche appartient |
layer_id |
ID du calque |
parent_id |
ID de calque du parent |
layer_name |
Nom du calque |
property |
Nom de la propriété tenant compte des champs répétés |
flat_property |
Le nom de la propriété ne tient pas compte des champs répétés |
value |
Valeur de la propriété au format de chaîne |
previous_value |
Valeur de la propriété de l'entrée précédente au format de chaîne |
Pour rechercher des données racine de hiérarchie, utilisez la vue sf_hierarchy_root_search
. Cette vue comprend les colonnes suivantes:
Colonne | Description |
---|---|
state_id |
ID unique de l'entrée |
ts |
Code temporel de l'entrée |
property |
Nom de la propriété tenant compte des champs répétés |
flat_property |
Le nom de la propriété ne tient pas compte des champs répétés |
value |
Valeur de la propriété au format de chaîne |
previous_value |
Valeur de la propriété de l'entrée précédente au format de chaîne |
Exemples de requêtes
Recherchez tous les frames où la couche
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'
Recherchez tous les frames où le calque
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
Recherchez tous les frames dont la limite inférieure
Wallpaper
est inférieure ou égale à 2 400:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
Répertoriez toutes les propriétés pour les é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, ']') ), '%' )
Vue SQL des transactions
Les données proto de transaction utilisent le format TransactionTraceEntry
.
Pour rechercher des données de transaction, utilisez la vue transactions_search
. Cette vue inclut les colonnes suivantes:
Colonne | Description |
---|---|
state_id |
ID unique de l'entrée à laquelle appartient la propriété proto |
ts |
Code temporel de l'entrée à laquelle la propriété proto appartient |
transaction_id |
ID de transaction, le cas échéant |
property |
Nom de la propriété tenant compte des champs répétés |
flat_property |
Le nom de la propriété ne tient pas compte des champs répétés |
value |
Valeur de la propriété au format de chaîne |
Exemples de requêtes
Recherchez le frame où une transaction a été appliquée pour modifier la position X du calque en -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 la couche
ImeContainer
a été ajoutée:SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
Vue SQL des transitions
Les données proto de transition utilisent le format ShellTransition
.
Pour rechercher des données de transition, utilisez la vue transitions_search
. Cette vue inclut les colonnes suivantes:
Colonne | Description |
---|---|
ts |
Heure d'envoi (si disponible, sinon 0 ) |
transition_id |
ID de transition |
property |
Nom de la propriété tenant compte des champs répétés |
flat_property |
Le nom de la propriété ne tient pas compte des champs répétés |
value |
Valeur de la propriété au format de chaîne |
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
Vue SQL ViewCapture
Les données du 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 |
Identifiant unique 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 la propriété tenant compte des champs répétés |
flat_property |
Le nom de la propriété ne tient pas compte des champs répétés |
value |
Valeur de la propriété au format de chaîne |
previous_value |
Valeur de la propriété de l'état précédent au format chaîne |
Exemples de requêtes
Recherchez tous les états lorsque SearchContainerView
a été déplacé dans la direction Y:
SELECT * FROM viewcapture_search
WHERE class_name LIKE '%SearchContainerView'
AND flat_property='translation_y'
AND value!=previous_value
Table SQL ProtoLog
Les données proto de ProtoLog utilisent le format ProtoLogMessage
. Cette vue comprend 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
Recherchez tous les journaux contenant un message contenant
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
Lorsque vous utilisez le panneau de gauche, la recherche de trace commence. Cette opération prend quelques secondes. La chronologie n'est pas disponible au début.
Une fois la recherche de trace initialisée, saisissez une requête dans le champ de recherche, puis cliquez sur Exécuter la requête de recherche ou appuyez sur Entrée sur votre clavier pour l'exécuter.
Lorsque vous avez terminé, 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 de l'enregistrer entre les sessions.
Pour accéder aux requêtes enregistrées, cliquez sur l'onglet Enregistrées dans le panneau de gauche, et pour accéder aux requêtes récemment exécutées, cliquez sur l'onglet Récentes:
Figure 2. Panneau de gauche de l'aperçu de recherche.
Résultats
Toutes les requêtes renvoient des résultats tabulés, affichés dans une vue à faire défiler avec un comportement interactif semblable aux visionneuses de traces basées sur les journaux, telles 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 chronologie en tant que nouvelle ligne d'entrées. Cliquez sur cette ligne et utilisez les flèches vers la gauche et vers la droite pour naviguer entre les entrées:
Figure 4. Calendrier de recherche.