คุณสามารถรวบรวมการติดตาม 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_overridesENABLE_ALL: ติดตามกลุ่มและระดับบันทึกทั้งหมด เว้นแต่จะระบุไว้ในgroup_overrides
ระดับบันทึกขั้นต่ำ (default_log_from_level): หากตั้งค่าไว้ ระบบจะติดตามข้อความที่มีระดับบันทึกสูงกว่าหรือเท่ากับระดับนี้ เว้นแต่จะมีการระบุการลบล้างกลุ่ม ตัวอย่างเช่น ใช้เพื่อเปิดใช้การบันทึกคำเตือนและข้อผิดพลาดทั้งหมดโดยไม่ต้องเปิดใช้บันทึกทั้งหมด ค่าที่รองรับมีดังนี้
PROTOLOG_LEVEL_DEBUGPROTOLOG_LEVEL_VERBOSEPROTOLOG_LEVEL_INFOPROTOLOG_LEVEL_WARNPROTOLOG_LEVEL_ERRORPROTOLOG_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แต่จะทริกเกอร์การสร้างสแนปชอตเลเยอร์เมื่อมีการสร้างรายงานข้อบกพร่องเท่านั้น ไม่ใช่ทุกครั้งที่ล้างข้อมูลการติดตาม
แฟล็กการติดตาม (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
การเปลี่ยนภาพของเชลล์
ใช้ชื่อแหล่งข้อมูล com.android.wm.shell.transition สำหรับการติดตามประเภทนี้
ตัวเลือกการกำหนดค่า
การติดตามประเภทนี้ไม่มีตัวเลือกการกำหนดค่า
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงประเภทการติดตามการเปลี่ยนภาพของเชลล์สำหรับ 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
การเปลี่ยนภาพของเชลล์
ระบบใช้คำสั่งต่อไปนี้สำหรับการติดตามการเปลี่ยนภาพ
ในกระบวนการ 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 \