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

אפשר להשתמש ב-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 שם השכבה
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. חיפוש בציר הזמן.