אפשר להשתמש ב-SQL כדי למצוא מצבים ספציפיים בקובצי מעקב של Winscope Perfetto. משתמשים בכלי הגלובלי Search בממשק המשתמש של Winscope כדי להריץ שאילתות ולהציג תוצאות בטבלה:
איור 1. חיפוש בכרטיסייה של הצופים.
הכלי Search מאפשר לכתוב ולהריץ שאילתות SQL מותאמות אישית על עקבות של Perfetto, וגם לגשת לשאילתות אחרונות ולשאילתות שנשמרו. Winscope מספק תצוגות SQL מיוחדות כדי לעזור בחיפוש של עקבות SurfaceFlinger, Transactions, Transitions ו-ViewCapture.
צריך להשתמש במוסכמות הבאות בכל התצוגות:
עבור העמודות
property
ו-flat_property
:- שמות המאפיינים הם בפורמט snake case, לדוגמה
visible_region
מתוךLayerProto
. סימון נקודות מייצג נכסים מוטמעים, לדוגמה:
visible_region.rect
.שדות חוזרים ב-
property
מובחנים באמצעות סוגריים מרובעים:לדוגמה, בשני מקרים של שדה חוזר
visible_region.rect
, השדהtop
מיוצג על ידיvisible_region.rect[0].top
ו-visible_region.rect[1].top
.אי אפשר להבחין בין שדות חוזרים ב-
flat_property
:לדוגמה, בשני מקרים של שדה חוזר
visible_region.rect
, השדהtop
מיוצג על ידיvisible_region.rect.top
בשני המקרים.
- שמות המאפיינים הם בפורמט snake case, לדוגמה
בעמודות
value
ו-previous_value
, ערכים בוליאניים מיוצגים על ידי0
(False
) או1
(True
).
Winscope יוצר את התצוגות האלה על ידי שילוב נתונים מטבלאות ספציפיות למעקב עם הטבלה args
של Perfetto.
אפשר להריץ שאילתות ישירות בטבלאות האלה. בטבלה args
, העמודות key
, flat_key
ו-display_value
מקבילות לעמודות בתצוגה property
, flat_property
ו-value
בהתאמה.
args
טבלה:
עמודה | תיאור |
---|---|
arg_set_id |
משמש לשיוך של קבוצת ארגומנטים |
flat_key |
שם הנכס מהודעת הפרוטו, לא כולל שדות חוזרים |
key |
שם הנכס מהודעת הפרוטו, כולל שדות חוזרים |
value_type |
סוג הערך של המאפיין |
int_value |
ערך המאפיין אם סוג הערך הוא מספר שלם |
string_value |
ערך המאפיין אם סוג הערך הוא מחרוזת |
real_value |
ערך המאפיין אם סוג הערך הוא ממשי |
display_value |
המרת ערך המאפיין למחרוזת |
תצוגות SQL של SurfaceFlinger
נתוני פרוטוקול SurfaceFlinger משתמשים בפורמטים האלה:
נתוני השכבה הם בפורמט
LayerProto
.נתוני הבסיס של ההיררכיה הם בפורמט
LayersSnapshotProto
.
כדי לחפש נתונים בשכבה, משתמשים בתצוגה sf_layer_search
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
state_id |
מזהה השורה של הרשומה שהשכבה שייכת אליה |
ts |
חותמת הזמן של הרשומה שהשכבה שייכת אליה |
layer_id |
מזהה השכבה |
parent_id |
מזהה השכבה של ההורה |
layer_name |
שם השכבה |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהרשומה הקודמת בפורמט מחרוזת |
כדי לחפש נתונים של שורש ההיררכיה, משתמשים בתצוגה sf_hierarchy_root_search
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
state_id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהרשומה הקודמת בפורמט מחרוזת |
שאילתות לדוגמה
חיפוש כל המסגרות שבהן לשכבה
IME
יש גבולות מסך תקינים:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'IME%' AND property='screen_bounds.bottom' AND value<='24000'
מאתרים את כל המסגרות שבהן
Taskbar
השכבהcolor.a
(אלפא) משתנה:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'Taskbar%' AND property='color.a' AND value!=previous_value
כדי למצוא את כל המסגרות שבהן הגבול התחתון של
Wallpaper
קטן מ-2400 או שווה לו:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name LIKE 'Wallpaper%' AND property='bounds.bottom' AND cast_int!(value) <= 2400
רשימת כל הנכסים לתצוגות עם ערימת שכבות תקינה:
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, ']') ), '%' )
חיפוש כל הפריימים שבהם אפשר לראות את התנועה לחזרה אחורה
SELECT DISTINCT STATE.ts FROM sf_layer_search STATE WHERE STATE.layer_name LIKE 'EdgeBackGestureHandler%'
טבלאות נתונים
התצוגות של SurfaceFlinger נוצרות באמצעות הטבלאות הבסיסיות הבאות.
surfaceflinger_layers_snapshot
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לרשומה הזו |
surfaceflinger_layer
:
עמודה | תיאור |
---|---|
id |
מזהה השורה בשכבה |
snapshot_id |
מזהה השורה של הרשומה מ-surfaceflinger_layers_snapshot שהשכבה שייכת אליה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לשכבה הזו |
תצוגת SQL של עסקאות
נתוני הפרוטו של העסקאות משתמשים בפורמט TransactionTraceEntry
.
כדי לחפש נתוני מעקב של עסקאות, משתמשים בתצוגה transactions_search
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
state_id |
מזהה השורה של הרשומה שאליה שייך נכס הפרוטו |
ts |
חותמת הזמן של הרשומה שאליה שייך מאפיין הפרוטו |
transaction_id |
מזהה עסקה (אם יש) |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
שאילתות לדוגמה
מוצאים את המסגרת שבה הוחלה עסקה כדי לשנות את המיקום של שכבה x ל--54.0:
SELECT ts, transaction_id, value FROM transactions_search WHERE flat_property='transactions.layer_changes.x' AND value='-54.0'
מאתרים את המסגרת שבה נוספה השכבה
ImeContainer
:SELECT ts FROM transactions_search WHERE flat_property='added_layers.name' AND value='ImeContainer'
טבלאות נתונים
תצוגת ה-SQL של העסקאות נוצרת באמצעות הטבלאות הבסיסיות הבאות.
surfaceflinger_transactions
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לרשומה הזו |
vsync_id |
מזהה VSync שמשויך לכל העסקאות ברשומה הזו |
android_surfaceflinger_transaction
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של העסקה |
snapshot_id |
מזהה השורה של הרשומה מ-surfaceflinger_transactions שאליה שייכת העסקה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לעסקה הזו |
transaction_id |
מזהה העסקה נלקח מהודעת פרוטו |
pid |
מזהה התהליך של העסקה נלקח מהודעת הפרוטוקול |
uid |
מזהה ייחודי של עסקה שנלקח מהודעת פרוטו |
layer_id |
מזהה השכבה שמשויכת לעסקה, אם רלוונטי |
display_id |
מזהה התצוגה שמשויך לעסקה, אם רלוונטי |
flags_id |
המזהה שמשמש לאחזור דגלים משויכים מ-android_surfaceflinger_transaction_flag |
transaction_type |
סוג עסקה |
android_surfaceflinger_transaction_flag
:
עמודה | תיאור |
---|---|
flags_id |
תואם לערך בשורה בגיליון android_surfaceflinger_transaction |
flag |
מחרוזת מתורגמת של דגל |
עסקאות בודדות מתווספות לטבלת הארגומנטים מפורמטים שונים של הודעות פרוטו, בהתאם לסוג העסקה:
-
LAYER_ADDED
:LayerCreationArgs
פורמט -
LAYER_CHANGED
:LayerState
פורמט -
DISPLAY_ADDED
:DisplayState
פורמט -
DISPLAY_CHANGED
:DisplayState
פורמט -
LAYER_DESTROYED
: No args -
LAYER_HANDLE_DESTROYED
: No args -
DISPLAY_REMOVED
: No args -
NOOP
: No args
תצוגת SQL של מעברים
הנתונים בפרוטו של המעברים הם בפורמט ShellTransition
.
כדי לחפש נתונים של מעברים, משתמשים בתצוגה transitions_search
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
ts |
זמן השילוח; אם זמין, הערך שמוחזר הוא זמן השליחה, אחרת 0 |
transition_id |
מזהה המעבר שנלקח מהודעת הפרוטו |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
מזהה ייחודי של עסקה שנלקח מהודעת פרוטו |
שאילתות לדוגמה
איתור מאפיינים של מעברים שמטופלים על ידי 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
טבלאות נתונים
התצוגה 'מעברים' נוצרת באמצעות הטבלאות הבסיסיות הבאות.
window_manager_shell_transitions
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של המעבר |
ts |
זמן השילוח; אם זמין, הערך שמוחזר הוא זמן השליחה, אחרת 0 |
transition_id |
מזהה המעבר שנלקח מהודעת הפרוטו |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args למעבר הזה |
transition_type |
סוג המעבר שנלקח מהודעת הפרוטו |
send_time_ns |
זמן השליחה של המעבר נלקח מהודעת הפרוטו |
dispatch_time_ns |
זמן השילוח של המעבר נלקח מהודעת הפרוטוקול |
duration_ns |
משך המעבר, אם יש שעת התחלה ושעת סיום |
handler |
Transition handler: אחזור תרגום מ-window_manager_shell_transition_handlers |
status |
סטטוס המעבר: played , merged או aborted |
flags |
דגלי מעבר שנלקחו מהודעת פרוטו |
window_manager_shell_transition_handlers
:
עמודה | תיאור |
---|---|
handler_id |
מזהה שמתאים לערך בעמודה handler של window_manager_shell_transitions |
handler_name |
תרגום מחרוזות |
android_window_manager_shell_transition_participants
:
עמודה | תיאור |
---|---|
transition_id |
מזהה המעבר שנלקח מהודעת פרוטו גולמית |
layer_id |
המזהה של המשתתף בשכבת SurfaceFlinger |
window_id |
המזהה של משתתף במאגר התגים של WindowManager |
תצוגת SQL של ViewCapture
הנתונים בפרוטוקול ViewCapture משתמשים בפורמט View
.
כדי לחפש נתונים של ViewCapture, משתמשים בתצוגה viewcapture_search
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
state_id |
מזהה השורה של המצב שאליו שייך התצוגה |
ts |
חותמת הזמן של המצב שאליו שייכת התצוגה |
package_name |
שם חבילה |
window_name |
שם החלון |
class_name |
הצגת שם הכיתה |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהמצב הקודם בפורמט מחרוזת |
שאילתות לדוגמה
כדי למצוא את כל המצבים שבהם SearchContainerView
זז בכיוון y:
SELECT * FROM viewcapture_search
WHERE class_name LIKE '%SearchContainerView'
AND flat_property='translation_y'
AND value!=previous_value
טבלאות נתונים
התצוגה ViewCapture נוצרת באמצעות הטבלאות הבסיסיות הבאות.
android_viewcapture
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לרשומה הזו |
android_viewcapture_view
:
עמודה | תיאור |
---|---|
id |
מזהה השורה של התצוגה |
snapshot_id |
מזהה השורה של הרשומה ממקור המידע android_viewcapture שהתצוגה שייכת אליה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לתצוגה הזו |
טבלת SQL של ProtoLog
נתוני הפרוטו של ProtoLog משתמשים בפורמט ProtoLogMessage
. התצוגה הזו כוללת את העמודות הבאות:
עמודה | תיאור |
---|---|
ts |
חותמת הזמן של היומן |
level |
רמת הרישום ביומן |
tag |
תג קבוצה לרישום ביומן |
message |
הודעה ביומן |
stacktrace |
דוח קריסות (אם זמין) |
location |
מיקום הקוד שממנו ההודעה מגיעה |
שאילתות לדוגמה
חיפוש כל היומנים עם הודעה שמכילה את
transition
:SELECT ts, message, location FROM protolog WHERE message LIKE '%transition%'
למצוא את כל היומנים שמכילים מזהי עסקאות תקינים:
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, '%');
הרצת שאילתות
אפשר להריץ שאילתות חיפוש באמצעות החלונית חיפוש גלובלי בצד ימין של מציג החיפוש.
כשאתם משתמשים בפעם הראשונה בחלונית GLOBAL SEARCH, מתבצעת אתחול של חיפוש העקבות ו-Winscope יוצרת את תצוגות ה-SQL של העזרה. התהליך נמשך כמה שניות. בזמן האתחול של החיפוש אחר עקבות, ציר הזמן לא זמין.
כדי להריץ שאילתה, כותבים אותה בתיבת החיפוש ולוחצים על הפעלת שאילתת חיפוש או מקישים על Enter במקלדת.
בסיום, טבלת התוצאות מוצגת בחלונית האמצעית. השאילתה שלכם מופיעה מתחת לתיבת החיפוש, עם שדה לשמירת השאילתה בין סשנים.
כדי לגשת לשאילתות שמורות, לוחצים על הכרטיסייה שמורות בחלונית הימנית. כדי לגשת לשאילתות שהופעלו לאחרונה, לוחצים על הכרטיסייה מהזמן האחרון:
איור 2. החלונית הימנית של כלי הצפייה בחיפוש.
תוצאות
כל השאילתות מחזירות תוצאות בטבלה, שמוצגות בתצוגה עם אפשרות גלילה והתנהגות אינטראקטיבית שדומה לכלי הצגת עקבות מבוססי-יומן, כמו Transactions ו-ProtoLog:
איור 3. תוצאות החיפוש במציג.
אם הטבלה שמתקבלת מכילה עמודה ts
, הערכים בעמודה הזו מתפרשים כחותמות זמן ומוספים לשכבת העל של ציר הזמן כשורה חדשה של רשומות. לוחצים על השורה הזו ומשתמשים במקשי החיצים שמאלה וימינה כדי לנווט בין הרשומות:
איור 4. חיפוש בציר הזמן.