คุณสามารถรวบรวมร่องรอย Winscope โดยใช้บรรทัดคำสั่ง adb
ในบิลด์แก้ไขข้อบกพร่อง (นั่นคือบิลด์ userdebug
และ eng
) ก่อนรวบรวมร่องรอย Winscope
ด้วย adb
ให้เรียกใช้ adb root
ตั้งแต่ Android 15 เป็นต้นไป การติดตามของ Winscope จะผสานรวมเข้ากับ Perfetto และรวบรวมโดยใช้บรรทัดคำสั่ง Perfetto การติดตาม Winscope แต่ละรายการเป็นแหล่งข้อมูล Perfetto ที่มีการกำหนดค่าของตนเอง คุณสามารถเปิดใช้การกําหนดค่าทีละรายการหรือในเซสชันการติดตามเดียวก็ได้
ใน Android 14 และต่ำกว่า การติดตาม Winscope แต่ละรายการจะมีคําสั่งที่แตกต่างกัน และคุณสามารถรวบรวมแต่ละรายการแยกกันได้ ดูข้อมูลเพิ่มเติมที่หัวข้อบันทึกร่องรอยใน Android 14 และต่ำกว่า
WindowManager
ใช้ชื่อแหล่งข้อมูล android.windowmanager
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
ระดับบันทึก (
log_level
): ระบุรายละเอียดการบันทึก ค่าที่รองรับLOG_LEVEL_VERBOSE
: บันทึกองค์ประกอบทั้งหมดพร้อมข้อมูลสูงสุดLOG_LEVEL_DEBUG
: บันทึกองค์ประกอบทั้งหมดแต่ไม่เขียนข้อมูลการกําหนดค่าทั้งหมดLOG_LEVEL_CRITICAL
: บันทึกเฉพาะองค์ประกอบที่มองเห็นได้โดยมีค่าใช้จ่ายด้านประสิทธิภาพขั้นต่ำ
ความถี่ในการบันทึก (
log_frequency
): กําหนดความถี่ในการบันทึกรายการLOG_FREQUENCY_FRAME
: บันทึกภาพรวมสถานะการติดตามเมื่อมีการคอมมิตเฟรมLOG_FREQUENCY_TRANSACTION
: บันทึกภาพสถานะการติดตามทุกครั้งที่มีการทําธุรกรรมLOG_FREQUENCY_SINGLE_DUMP
: ติดตามสแนปชอตสถานะเดียวเมื่อเริ่มแหล่งข้อมูล
ดูรายละเอียดเกี่ยวกับค่าการกําหนดค่าได้ที่ WindowManager
ตัวอย่าง
ต่อไปนี้คือตัวอย่างประเภทการติดตาม WindowManager สําหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
EOF
ProtoLog
ใช้ชื่อแหล่งข้อมูล android.protolog
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
โหมดการติดตาม (tracing_mode
): กำหนดการกำหนดค่าบันทึกที่จะใช้
DEFAULT
: ติดตามเฉพาะกลุ่มบันทึกและระดับที่ระบุในgroup_overrides
ENABLE_ALL
: ติดตามกลุ่มและระดับบันทึกทั้งหมด เว้นแต่จะระบุไว้ในgroup_overrides
ระดับบันทึกขั้นต่ำ (default_log_from_level
): หากตั้งค่าไว้ ระบบจะติดตามข้อความที่มีระดับบันทึกสูงกว่าหรือเท่ากับระดับนี้ เว้นแต่จะมีการระบุการลบล้างระดับกลุ่ม เช่น ใช้ในการเปิดใช้การบันทึกคําเตือนและข้อผิดพลาดทั้งหมดโดยไม่ต้องเปิดใช้บันทึกทั้งหมด ค่าที่รองรับมีดังนี้
PROTOLOG_LEVEL_DEBUG
PROTOLOG_LEVEL_VERBOSE
PROTOLOG_LEVEL_INFO
PROTOLOG_LEVEL_WARN
PROTOLOG_LEVEL_ERROR
PROTOLOG_LEVEL_WTF
การลบล้างระดับกลุ่ม (group_overrides
): เปิดใช้การกำหนดค่าระดับบันทึกด้วยตนเองสำหรับกลุ่ม ProtoLog แต่ละกลุ่ม โดยแต่ละกลุ่มประกอบด้วย
name
: ชื่อกลุ่ม ProtoLog ซึ่งใช้ในซอร์สโค้ด Androidlog_from
: เหมือนกับdefault_log_from_level
แต่ระบุไว้สำหรับกลุ่มปัจจุบันเท่านั้นcollect_stacktrace
: เมื่อตั้งค่าเป็นtrue
ระบบจะรวบรวมสแต็กเทรซสําหรับข้อความ ProtoLog แต่ละรายการในกลุ่มที่ติดตาม
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างประเภทการติดตาม ProtoLog สำหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: DEFAULT
default_log_from_level: PROTOLOG_LEVEL_WARN
group_overrides: {
group_name: "WM_SHELL_STARTING_WINDOW"
log_from: PROTOLOG_LEVEL_DEBUG
collect_stacktrace: true
}
}
}
}
EOF
อินพุต
ใช้ชื่อแหล่งข้อมูล android.input.inputevent
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
โหมดการติดตาม (trace_mode
): กําหนดว่าควรเริ่มการติดตามอินพุตโดยใช้กฎการรักษาความเป็นส่วนตัวหรือบันทึกเหตุการณ์อินพุตทั้งหมด
TRACE_MODE_TRACE_ALL
: บันทึกเหตุการณ์อินพุตทั้งหมดที่ระบบประมวลผล โดยไม่คำนึงถึงบริบทที่ประมวลผลTRACE_MODE_USE_RULES
: ใช้กฎการติดตามที่กําหนดไว้ในการกําหนดค่านี้เพื่อระบุเหตุการณ์ที่จะติดตาม ดูข้อมูลเพิ่มเติมเกี่ยวกับการระบุกฎสําหรับการติดตามได้ที่android_input_event_config.proto
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างประเภทการติดตามอินพุตสําหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
EOF
SurfaceFlinger (เลเยอร์)
ใช้ชื่อแหล่งข้อมูล android.surfaceflinger.layers
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
โหมดการติดตาม (mode
): กําหนดความถี่ในการบันทึกรายการ
MODE_ACTIVE
: สแนปชอตเลเยอร์การติดตาม ระบบจะจับภาพหน้าจอทุกครั้งที่มีการเปลี่ยนแปลงเลเยอร์MODE_GENERATED
: สร้างสแนปชอตเลเยอร์จากธุรกรรมที่จัดเก็บไว้ในบัฟเฟอร์แบบวงแหวนภายในของ SurfaceFlinger การสร้างภาพรวมของเลเยอร์จะเกิดขึ้นเมื่อล้างข้อมูลแหล่งข้อมูลนี้MODE_DUMP
: ติดตามภาพรวมเลเยอร์เดียวMODE_GENERATED_BUGREPORT_ONLY
: เหมือนกับMODE_GENERATED
แต่ทริกเกอร์การสร้างสแนปชอตเลเยอร์เฉพาะเมื่อมีการส่งรายงานข้อบกพร่องเท่านั้น ไม่ใช่ทุกครั้งที่มีการล้างการติดตาม
Flag การติดตาม (trace_flags
):
TRACE_FLAG_INPUT
: หากแพลตฟอร์มมีข้อมูลอินพุต ให้ติดตามรายละเอียดของกรอบเวลาอินพุตTRACE_FLAG_COMPOSITION
: ติดตามประเภทองค์ประกอบและบริเวณที่มองเห็นได้TRACE_FLAG_EXTRA
: ติดตามข้อมูลเมตาของพื้นผิวเพิ่มเติม รวมถึงเลเยอร์ที่อยู่นอกหน้าจอTRACE_FLAG_HWC
: ติดตามข้อมูลเมตาของเครื่องมือแต่งเพลงฮาร์ดแวร์ที่ไม่มีโครงสร้างเพิ่มเติมTRACE_FLAG_BUFFERS
: กําหนดค่า SurfaceFlinger ให้ติดตามการเปลี่ยนแปลงบัฟเฟอร์ทั้งหมดบนแพลตฟอร์ม โดยค่าเริ่มต้น SurfaceFlinger จะติดตามสถานะใหม่เฉพาะเมื่อมีการเปลี่ยนแปลงเรขาคณิตเท่านั้นTRACE_FLAG_VIRTUAL_DISPLAYS
: รวมเลเยอร์การแสดงผลเสมือนจริงในการติดตาม
ตัวอย่าง
ต่อไปนี้คือตัวอย่างประเภทการติดตาม SurfaceFlinger สำหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
EOF
ดูรายละเอียดเกี่ยวกับความหมายของค่าการกําหนดค่าต่างๆ ได้ที่ SurfaceFlinger
การเปลี่ยน Shell
ใช้ชื่อแหล่งข้อมูล com.android.wm.shell.transition
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
การติดตามประเภทนี้ไม่มีตัวเลือกการกําหนดค่า
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างประเภทการติดตามการเปลี่ยน Shell สําหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
EOF
SurfaceFlinger (ธุรกรรม)
ใช้ชื่อแหล่งข้อมูล android.surfaceflinger.transactions
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
โหมดการติดตาม (mode
): กําหนดความถี่ในการบันทึกรายการ
MODE_CONTINUOUS
: SurfaceFlinger จะเขียนบัฟเฟอร์วงแหวนภายในของธุรกรรมทุกครั้งที่มีการล้างข้อมูลแหล่งที่มา บัฟเฟอร์แบบวงแหวนประกอบด้วยสถานะเริ่มต้นของ SurfaceFlinger และธุรกรรมล่าสุดMODE_ACTIVE
: SurfaceFlinger จะเขียนสถานะเริ่มต้น จากนั้นจะเขียนธุรกรรมขาเข้าแต่ละรายการจนกว่าแหล่งข้อมูลจะหยุดลง
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างประเภทการติดตามธุรกรรม SurfaceFlinger สำหรับadb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
EOF
IME
ใช้ชื่อแหล่งข้อมูล: android.inputmethod
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
การติดตามประเภทนี้ไม่มีตัวเลือกการกําหนดค่า
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างประเภทการติดตาม IME สำหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.inputmethod"
}
}
EOF
ViewCapture
ใช้ชื่อแหล่งข้อมูล android.viewcapture
สําหรับการติดตามประเภทนี้
ตัวเลือกการกําหนดค่า
การติดตามประเภทนี้ไม่มีตัวเลือกการกําหนดค่า
ตัวอย่าง
ต่อไปนี้เป็นตัวอย่างการติดตามประเภท ViewCapture สําหรับ adb
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
ตัวอย่างที่สมบูรณ์
Perfetto ช่วยให้คุณรวบรวมข้อมูลจากแหล่งที่มาหลายแห่งในการกําหนดค่าครั้งเดียว คุณสามารถรวบรวมร่องรอย Winscope ทั้งหมดได้ด้วยคําสั่งเดียว ดังนี้
$ adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
<<EOF
unique_session_name: "my_custom_session"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.windowmanager"
windowmanager_config: {
log_level: LOG_LEVEL_VERBOSE
log_frequency: LOG_FREQUENCY_TRANSACTION
}
}
}
data_sources: {
config {
name: "android.protolog"
protolog_config: {
tracing_mode: ENABLE_ALL
}
}
}
data_sources: {
config {
name: "android.input.inputevent"
android_input_event_config: {
mode: TRACE_MODE_TRACE_ALL
}
}
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
data_sources: {
config {
name: "com.android.wm.shell.transition"
}
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
data_sources: {
config {
name: "android.inputmethod"
}
}
data_sources: {
config {
name: "android.viewcapture"
}
}
EOF
บันทึกร่องรอยใน Android 14 และต่ำกว่า
เรียกใช้ adb root
ก่อนเรียกใช้คำสั่ง adb shell
สําหรับการติดตามแต่ละรายการต่อไปนี้ เมื่อการติดตามสิ้นสุดลง ไฟล์การติดตามจะพร้อมใช้งานใน /data/misc/wmtrace
หากต้องการคัดลอกไฟล์หรือไดเรกทอรีและไดเรกทอรีย่อยจากอุปกรณ์ โปรดดูหัวข้อคัดลอกไฟล์ไปยังและจากอุปกรณ์
การติดตาม WindowManager
วิธีบันทึกร่องรอย WindowManager
เปิดใช้การติดตาม
adb shell wm tracing start
วิธีปิดใช้การติดตาม
adb shell wm tracing stop
บันทึกข้อมูลการบันทึกลงในไฟล์ขณะเรียกใช้การบันทึกร่องรอย
adb shell wm tracing save-for-bugreport
บันทึกการติดตาม 1 ครั้งต่อเฟรม
adb shell wm tracing frame
บันทึกธุรกรรมแต่ละรายการ
adb shell wm tracing transaction
ตั้งค่าขนาดบันทึกสูงสุด (เป็น KB)
adb shell wm tracing size
พิมพ์สถานะการติดตาม
adb shell wm tracing status
ตั้งค่าระดับบันทึกเป็น
critical
(เฉพาะหน้าต่างที่มองเห็นได้ซึ่งมีข้อมูลแบบจํากัด)trim
(หน้าต่างทั้งหมดที่มีข้อมูลแบบจํากัด) หรือall
(หน้าต่างและข้อมูลทั้งหมด)adb shell wm tracing level
ข้อมูลสรุปของ WindowManager
วิธีจับภาพการถ่ายโอนข้อมูลของ WindowManager
adb exec-out dumpsys window --proto > window_dump.winscope
ProtoLog
ระบบ ProtoLog ใช้คําสั่งต่อไปนี้
ในกระบวนการ system_server
เริ่ม ProtoLog:
adb shell cmd window logging start
หยุด ProtoLog:
adb shell cmd window logging stop
เปิดใช้ ProtoLog สําหรับกลุ่มบันทึกที่ระบุ
adb shell cmd window logging enable [group...]
ปิดใช้ ProtoLog สําหรับกลุ่มบันทึกที่ระบุ
adb shell cmd window logging disable [group...]
เปิดใช้การบันทึก Logcat สําหรับกลุ่มบันทึกที่ระบุ
adb shell cmd window logging enable-text [group...]
ปิดใช้การบันทึก Logcat สําหรับกลุ่มบันทึกที่ระบุ
adb shell cmd window logging disable-text [group...]
ใน WMShell
เริ่ม ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
ร่องรอย SurfaceFlinger (เลเยอร์)
การติดตามเลเยอร์ SurfaceFlinger ใช้การติดตาม Perfetto ในการบันทึก ดูข้อมูลการกําหนดค่าได้ที่การกําหนดค่าการติดตาม
ดูตัวอย่างการกําหนดค่าสําหรับการติดตามเลเยอร์ SurfaceFlinger ต่อไปนี้
unique_session_name: "surfaceflinger_layers_active"
buffers: {
size_kb: 63488
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.layers"
surfaceflinger_layers_config: {
mode: MODE_ACTIVE
trace_flags: TRACE_FLAG_INPUT
trace_flags: TRACE_FLAG_COMPOSITION
trace_flags: TRACE_FLAG_HWC
trace_flags: TRACE_FLAG_BUFFERS
trace_flags: TRACE_FLAG_VIRTUAL_DISPLAYS
}
}
}
ดูตัวอย่างคําสั่งต่อไปนี้เพื่อสร้างการติดตามสําหรับเลเยอร์ SurfaceFlinger
adb shell -t perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \
ข้อมูลพุลิปของ SurfaceFlinger (เลเยอร์)
วิธีจับภาพการถ่ายโอนข้อมูล SurfaceFlinger
adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope
การเปลี่ยน Shell
คําสั่งต่อไปนี้ใช้สําหรับการติดตามการเปลี่ยน
ในกระบวนการ system_server
วิธีเริ่มการติดตาม
adb shell cmd window shell tracing start
วิธีหยุดการติดตาม
adb shell cmd window shell tracing stop
เริ่มการติดตามใน WMShell
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
วิธีหยุดการติดตามใน WMShell
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
คําสั่งต่อไปนี้ใช้สำหรับการติดตามตัวแก้ไขวิธีการป้อนข้อมูล (IME)
เริ่มการติดตาม IME สำหรับไคลเอ็นต์วิธีการป้อนข้อมูล (IM), บริการวิธีการป้อนข้อมูล (IMS) และบริการจัดการวิธีการป้อนข้อมูล (IMMS) โดยทำดังนี้
adb shell ime tracing start
เริ่มติดตามไคลเอ็นต์ IME, IMS และ IMMS โดยทำดังนี้
adb shell ime tracing stop
SurfaceFlinger (ธุรกรรม)
การติดตามธุรกรรมของ SurfaceFlinger ใช้การติดตาม Perfetto ในการบันทึก ดูข้อมูลการกําหนดค่าได้ที่การกําหนดค่าการติดตาม
ดูตัวอย่างการกำหนดค่า Perfetto สำหรับการติดตาม SurfaceFlinger ที่ทำงานอยู่ต่อไปนี้
unique_session_name: "surfaceflinger_transactions_active"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_ACTIVE
}
}
}
write_into_file: true
file_write_period_ms: 100
ดูตัวอย่างการกำหนดค่า Perfetto สำหรับ SurfaceFlinger ต่อไปนี้การติดตามอย่างต่อเนื่อง
unique_session_name: "surfaceflinger_transactions_continuous"
buffers: {
size_kb: 1024
fill_policy: RING_BUFFER
}
data_sources: {
config {
name: "android.surfaceflinger.transactions"
surfaceflinger_transactions_config: {
mode: MODE_CONTINUOUS
}
}
}
ดูตัวอย่างคําสั่งต่อไปนี้เพื่อสร้างการติดตามสําหรับธุรกรรม SurfaceFlinger
adb shell perfetto \
-c - --txt \
-o /data/misc/perfetto-traces/trace \