การค้นหาการติดตาม

ใช้ SQL เพื่อค้นหาสถานะที่เฉพาะเจาะจงในร่องรอย Perfetto ของ Winscope ใช้โปรแกรมดูการค้นหาส่วนกลางใน UI ของ Winscope เพื่อเรียกใช้การค้นหาและแสดงผลลัพธ์ที่จัดตารางไว้ เป็นภาพ

แท็บผู้ดูการค้นหา

รูปที่ 1 แท็บผู้ชมที่ค้นหา

โปรแกรมดูค้นหาช่วยให้คุณเขียนและเรียกใช้การค้นหา SQL ที่กำหนดเองใน Perfetto traces รวมถึงเข้าถึงการค้นหาล่าสุดและที่บันทึกไว้ได้ Winscope มีมุมมอง SQL เฉพาะเพื่อช่วยในการค้นหาการติดตาม SurfaceFlinger, ธุรกรรม, การเปลี่ยนภาพ และ ViewCapture

ใช้รูปแบบต่อไปนี้สำหรับทุกมุมมอง

  • สำหรับคอลัมน์ property และ flat_property

    • ชื่อพร็อพเพอร์ตี้อยู่ในรูปแบบ Snake Case เช่น visible_region จาก LayerProto
    • สัญกรณ์แบบจุดแสดงถึงพร็อพเพอร์ตี้ที่ซ้อนกัน เช่น visible_region.rect

    • ฟิลด์ที่ซ้ำใน property จะแยกความแตกต่างด้วยวงเล็บเหลี่ยม ดังนี้

      ตัวอย่างเช่น ในอินสแตนซ์ 2 รายการของฟิลด์ที่ซ้ำ visible_region.rect ฟิลด์ top จะแสดงด้วย visible_region.rect[0].top และ visible_region.rect[1].top

    • ฟิลด์ที่ซ้ำใน flat_property จะแยกความแตกต่างไม่ได้

      เช่น ในอินสแตนซ์ 2 รายการของฟิลด์ที่ซ้ำกัน visible_region.rect ฟิลด์ top จะแสดงด้วย visible_region.rect.top ในทั้ง 2 อินสแตนซ์

  • สำหรับคอลัมน์ value และ previous_value ค่าบูลีนจะแสดงด้วย 0 (False) หรือ 1 (True)

Winscope สร้างมุมมองเหล่านี้โดยรวมข้อมูลจากตารางที่เฉพาะเจาะจงกับการติดตามเข้ากับตาราง Perfetto args คุณสามารถค้นหาตารางเหล่านี้ได้โดยตรง ในargsตาราง คอลัมน์ key, flat_key และ display_value จะคล้ายกับคอลัมน์มุมมอง property, flat_property และ value ตามลําดับ

args ตาราง

คอลัมน์ คำอธิบาย
arg_set_id ใช้เพื่อเชื่อมโยงชุดอาร์กิวเมนต์
flat_key ชื่อพร็อพเพอร์ตี้จากข้อความ Proto โดยไม่คำนึงถึงฟิลด์ที่ซ้ำกัน
key ชื่อพร็อพเพอร์ตี้จากข้อความ Proto โดยพิจารณาช่องที่ซ้ำ
value_type ประเภทค่าพร็อพเพอร์ตี้
int_value ค่าพร็อพเพอร์ตี้หากประเภทค่าเป็นจำนวนเต็ม
string_value ค่าพร็อพเพอร์ตี้หากประเภทค่าเป็นสตริง
real_value ค่าพร็อพเพอร์ตี้หากประเภทค่าเป็นจริง
display_value ค่าพร็อพเพอร์ตี้ที่ส่งไปยังสตริง

มุมมอง SQL ของ SurfaceFlinger

ข้อมูล Proto ของ 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 ของธุรกรรม

ข้อมูล Proto ของธุรกรรมใช้รูปแบบ TransactionTraceEntry

หากต้องการค้นหาข้อมูลการติดตามธุรกรรม ให้ใช้มุมมอง transactions_search มุมมองนี้ มีคอลัมน์ต่อไปนี้

คอลัมน์ คำอธิบาย
state_id รหัสแถวของรายการที่พร็อพเพอร์ตี้ Proto เป็นของ
ts การประทับเวลาของรายการที่พร็อพเพอร์ตี้ Proto เป็นของ
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 รหัสธุรกรรมที่นำมาจากข้อความ Proto
pid PID ธุรกรรมที่นำมาจากข้อความ Proto
uid UID ของธุรกรรมที่นำมาจากข้อความ Proto
layer_id รหัสของเลเยอร์ที่เชื่อมโยงกับธุรกรรม (หากมี)
display_id รหัสของจอแสดงผลที่เชื่อมโยงกับธุรกรรม (หากมี)
flags_id รหัสที่ใช้เพื่อดึงแฟล็กที่เชื่อมโยงจาก android_surfaceflinger_transaction_flag
transaction_type ประเภทธุรกรรม

android_surfaceflinger_transaction_flag:

คอลัมน์ คำอธิบาย
flags_id ตรงกับค่าในแถวใน android_surfaceflinger_transaction
flag สตริงของธงที่แปลแล้ว

ระบบจะเพิ่มธุรกรรมแต่ละรายการลงในตาราง args จากรูปแบบข้อความ Proto ที่แตกต่างกัน โดยอิงตามประเภทธุรกรรม ดังนี้

  • LAYER_ADDED: รูปแบบ LayerCreationArgs
  • LAYER_CHANGED: รูปแบบ LayerState
  • DISPLAY_ADDED: รูปแบบ DisplayState
  • DISPLAY_CHANGED: รูปแบบ DisplayState
  • LAYER_DESTROYED: ไม่มีอาร์กิวเมนต์
  • LAYER_HANDLE_DESTROYED: ไม่มีอาร์กิวเมนต์
  • DISPLAY_REMOVED: ไม่มีอาร์กิวเมนต์
  • NOOP: ไม่มีอาร์กิวเมนต์

มุมมอง SQL ของการเปลี่ยน

ข้อมูล Proto ของการเปลี่ยนฉากใช้รูปแบบ ShellTransition

หากต้องการค้นหาข้อมูลการเปลี่ยนหน้า ให้ใช้มุมมอง transitions_search มุมมองนี้ มีคอลัมน์ต่อไปนี้

คอลัมน์ คำอธิบาย
ts เวลาการเลือกจ่ายงาน หากมีจะกลับไปเป็นเวลาส่ง ไม่เช่นนั้นจะเป็น 0
transition_id รหัสการเปลี่ยนผ่านที่นำมาจากข้อความ Proto
property ชื่อพร็อพเพอร์ตี้ที่พิจารณาช่องที่ซ้ำ
flat_property ชื่อพร็อพเพอร์ตี้ไม่ได้คำนึงถึงฟิลด์ที่ซ้ำกัน
value UID ของธุรกรรมที่นำมาจากข้อความ Proto

ตัวอย่างคำค้นหา

ค้นหาพร็อพเพอร์ตี้ของการเปลี่ยนฉากที่จัดการโดย 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 รหัสการเปลี่ยนผ่านที่นำมาจากข้อความ Proto
arg_set_id รหัสที่ใช้เชื่อมโยงแถวจากตาราง args กับการเปลี่ยนผ่านนี้
transition_type ประเภทการเปลี่ยนที่นำมาจากข้อความ Proto
send_time_ns เวลาส่งการเปลี่ยนผ่านที่นำมาจากข้อความ Proto
dispatch_time_ns เวลาจัดส่งการเปลี่ยนผ่านที่นำมาจากข้อความโปรโต
duration_ns ระยะเวลาการเปลี่ยนฉาก หากมีเวลาเริ่มต้นและเวลาสิ้นสุด
handler ตัวแฮนเดิลการเปลี่ยน: ดึงข้อมูลการแปลจาก window_manager_shell_transition_handlers
status สถานะการเปลี่ยน: played, merged หรือ aborted
flags ค่าสถานะการเปลี่ยนภาพที่นำมาจากข้อความ Proto

window_manager_shell_transition_handlers:

คอลัมน์ คำอธิบาย
handler_id รหัสที่สอดคล้องกับค่าในคอลัมน์ handler ของ window_manager_shell_transitions
handler_name การแปลสตริง

android_window_manager_shell_transition_participants:

คอลัมน์ คำอธิบาย
transition_id รหัสการเปลี่ยนผ่านที่นำมาจากข้อความ Proto ดิบ
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 proto ใช้รูปแบบ 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, '%');
    

เรียกใช้การค้นหา

คุณสามารถเรียกใช้การค้นหาโดยใช้แผงการค้นหาทั่วโลกทางด้านซ้ายของโปรแกรมดูการค้นหา

เมื่อโต้ตอบกับแผงการค้นหาทั่วโลกเป็นครั้งแรก การค้นหาร่องรอย จะเริ่มต้นขึ้นและ Winscope จะสร้างมุมมอง SQL ตัวช่วย การดำเนินการนี้จะใช้เวลาสักครู่ ขณะที่การค้นหาร่องรอยกำลังเริ่มต้น ไทม์ไลน์จะไม่พร้อมใช้งาน

หากต้องการเริ่มคําค้นหา ให้เขียนคําค้นหาในช่องค้นหา แล้วคลิกเรียกใช้คําค้นหา หรือกด Enter บนแป้นพิมพ์เพื่อเรียกใช้

เมื่อเสร็จแล้ว ตารางผลลัพธ์จะแสดงในแผงตรงกลาง คำค้นหาจะปรากฏใต้ช่องค้นหาพร้อมช่องสำหรับบันทึกคำค้นหาระหว่างเซสชัน

คุณเข้าถึงการค้นหาที่บันทึกไว้ได้โดยคลิกแท็บบันทึกแล้วในแผงด้านซ้าย และเข้าถึงการค้นหาที่เรียกใช้ล่าสุดได้โดยคลิกแท็บล่าสุด

แผงด้านซ้ายของผู้ดูการค้นหา

รูปที่ 2 แผงด้านซ้ายของโปรแกรมดูการค้นหา

ผลลัพธ์

การค้นหาทั้งหมดจะแสดงผลลัพธ์ในรูปแบบตาราง ซึ่งแสดงในมุมมองที่เลื่อนได้พร้อม ลักษณะการทำงานแบบอินเทอร์แอกทีฟที่คล้ายกับโปรแกรมดูการติดตามตามบันทึก เช่น ธุรกรรมและ ProtoLog

ผลการค้นหาของผู้ชม

รูปที่ 3 ผลการค้นหาของโปรแกรมดู

หากตารางที่ได้มีคอลัมน์ ts ระบบจะตีความค่าในคอลัมน์นั้นเป็น การประทับเวลาและเพิ่มลงในการซ้อนทับไทม์ไลน์เป็นแถวใหม่ของ รายการ คลิกแถวนี้และใช้แป้นลูกศรซ้ายและขวาเพื่อไปยังรายการต่างๆ

ไทม์ไลน์การค้นหา

รูปที่ 4 ค้นหาไทม์ไลน์