אפשר להשתמש ב-SQL כדי למצוא מצבים ספציפיים בקובצי מעקב של Winscope Perfetto. מציג החיפוש הגלובלי בממשק המשתמש של 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 |
שם השכבה |
is_visible |
הצגה/הסתרה של שכבה |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהרשומה הקודמת בפורמט מחרוזת |
כדי לחפש נתונים של שורש ההיררכיה, משתמשים בתצוגה sf_hierarchy_root_search. התצוגה הזו כוללת את העמודות הבאות:
| עמודה | תיאור |
|---|---|
state_id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהרשומה הקודמת בפורמט מחרוזת |
שאילתות לדוגמה
חיפוש כל הפריימים שבהם השכבה
IMEגלויה:SELECT DISTINCT ts, layer_id, layer_name FROM sf_layer_search WHERE layer_name like 'IME%' AND is_visible=1חיפוש כל המסגרות שבהן לשכבה
IMEיש גבולות מסך תקינים:SELECT ts, value, previous_value FROM sf_layer_search WHERE layer_name like 'IME%' AND property='screen_bounds.bottom' AND value<='24000'כאן תוכלו לראות את כל הפריימים שבהם השכבה
Taskbarcolor.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
נתוני ה-proto של 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, '%');
תצוגת SQL של WindowManager
נתוני הפרוטו של WindowManager משתמשים בפורמט ההיררכי WindowManagerServiceDumpProto. אפשר לחפש מאפיינים של כל מאגר WindowManager, כולל:
DisplayContentProtoDisplayAreaProtoTaskProtoActivityRecordProtoWindowTokenProtoWindowStateProtoTaskFragmentProtoWindowContainerProto
כדי לחפש נתונים של WindowManager, משתמשים בתצוגה wm_search. התצוגה הזו כוללת את העמודות הבאות:
| עמודה | תיאור |
|---|---|
state_id |
מזהה השורה של המצב שאליו שייך המאגר |
ts |
חותמת הזמן של המצב שאליו שייך מאגר התגים |
title |
כותרת המאגר |
token |
טוקן מאגר |
parent_token |
טוקן של מאגר תגים ראשי |
is_visible |
חשיפה של הקונטיינר |
property |
שם הנכס שכולל שדות חוזרים |
flat_property |
שם הנכס לא מתייחס לשדות חוזרים |
value |
ערך המאפיין בפורמט מחרוזת |
previous_value |
ערך המאפיין מהמצב הקודם בפורמט מחרוזת |
שאילתות לדוגמה
איתור כל המדינות שבהן
LauncherActivityמוצג:SELECT DISTINCT ts, title, token FROM wm_search WHERE title like '%LauncherActivity%' AND is_visible=1איתור כל המדינות שבהן פני השטח של
Wallpaperנמצאים בתנועה:SELECT ts, value, previous_value FROM wm_search WHERE title like '%Wallpaper%' AND property like '%surface_position%' AND value != previous_value
טבלאות נתונים
התצוגה WindowManager נוצרת באמצעות הטבלאות הבסיסיות הבאות.
android_windowmanager:
| עמודה | תיאור |
|---|---|
id |
מזהה השורה של הרשומה |
ts |
חותמת הזמן של הרשומה |
arg_set_id |
המזהה שמשמש לשיוך שורות מהטבלה args לרשומה הזו |
android_windowmanager_windowcontainer:
| עמודה | תיאור |
|---|---|
id |
מזהה השורה של מאגר התגים |
snapshot_id |
מזהה השורה של הרשומה מ-android_windowmanager שהמאגר שייך אליה |
arg_set_id |
מזהה שמשמש לשיוך שורות מהטבלה args לתצוגה הזו |
הרצת שאילתות
אפשר להריץ שאילתות חיפוש באמצעות החלונית חיפוש גלובלי שמימין למציג החיפוש.
כשאתם משתמשים בפעם הראשונה בחלונית GLOBAL SEARCH, מתבצעת אתחול של חיפוש העקבות ו-Winscope יוצרת את תצוגות העזר של SQL. התהליך נמשך כמה שניות. בזמן האתחול של חיפוש העקבות, ציר הזמן לא זמין.
כדי להריץ שאילתה, כותבים אותה בתיבת החיפוש ולוחצים על הפעלת שאילתת חיפוש או מקישים על Enter במקלדת.
בסיום, טבלת התוצאות מוצגת בחלונית האמצעית. השאילתה שלכם מופיעה מתחת לתיבת החיפוש, עם שדה לשמירת השאילתה בין הפעלות.
כדי לגשת לשאילתות שמורות, לוחצים על הכרטיסייה שמורות בחלונית הימנית. כדי לגשת לשאילתות שהופעלו לאחרונה, לוחצים על הכרטיסייה אחרונות:
איור 2. החלונית השמאלית של כלי הצפייה בחיפוש.
תוצאות
כל השאילתות מחזירות תוצאות בטבלה, שמוצגות בתצוגה שאפשר לגלול בה עם התנהגות אינטראקטיבית שדומה לכלי הצגת עקבות מבוסס-יומן, כמו Transactions ו-ProtoLog:
איור 3. תוצאות החיפוש.
אם הטבלה שמתקבלת מכילה עמודה ts, הערכים בעמודה הזו מתפרשים כחותמות זמן ומוסיפים אותם לשכבת העל של ציר הזמן כשורה חדשה של רשומות. לוחצים על השורה הזו ומשתמשים במקשי החיצים שמאלה וימינה כדי לנווט בין הרשומות:
איור 4. חיפוש בציר הזמן.