ใช้ 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 อินสแตนซ์
- ชื่อพร็อพเพอร์ตี้อยู่ในรูปแบบ Snake Case เช่น
สำหรับคอลัมน์
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 ค้นหาไทม์ไลน์