חיפוש בנתוני מעקב

אפשר להשתמש ב-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 בשני המקרים.

  • בעמודות 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 משתמשים בפורמטים האלה:

כדי לחפש נתונים בשכבה, משתמשים בתצוגה 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'
    
  • מחפשים את כל הפריימים שבהם השכבה 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

נתוני ה-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, כולל:

כדי לחפש נתונים ב-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 בצד ימין של מציג החיפוש.

כשאתם מתחילים להשתמש בחלונית GLOBAL SEARCH, מתבצעת אתחול של חיפוש העקבות ו-Winscope יוצר תצוגות עזר של SQL. התהליך נמשך כמה שניות. בזמן שהחיפוש אחר עקבות מאותחל, ציר הזמן לא זמין.

כדי להריץ שאילתה, כותבים אותה בתיבת החיפוש ולוחצים על הפעלת שאילתת חיפוש או מקישים על Enter במקלדת.

בסיום, טבלת התוצאות מוצגת בחלונית האמצעית. השאילתה שלכם מופיעה מתחת לתיבת החיפוש, עם שדה לשמירת השאילתה בין סשנים.

כדי לגשת לשאילתות שמורות, לוחצים על הכרטיסייה שמורות בחלונית הימנית. כדי לגשת לשאילתות שהופעלו לאחרונה, לוחצים על הכרטיסייה מהזמן האחרון:

החלונית הימנית של כלי הצפייה בחיפוש

איור 2. החלונית הימנית של הצגת תוצאות החיפוש.

תוצאות

כל השאילתות מחזירות תוצאות בטבלה, שמוצגות בתצוגה שאפשר לגלול בה עם התנהגות אינטראקטיבית שדומה לכלי צפייה במעקב מבוסס-יומן, כמו Transactions ו-ProtoLog:

תוצאות של הצגת חיפוש

איור 3. תוצאות החיפוש במציג.

אם הטבלה שמתקבלת מכילה עמודה ts, הערכים בעמודה הזו מתפרשים כחותמות זמן ומוספים לשכבת העל של ציר הזמן כשורה חדשה של רשומות. לוחצים על השורה הזו ומשתמשים במקשי החיצים שמאלה וימינה כדי לנווט בין הרשומות:

ציר הזמן של החיפוש

איור 4. חיפוש בציר הזמן.