يمكن جمع عمليات تتبُّع Winscope باستخدام سطر الأوامر adb
في إصدارات تصحيح الأخطاء
(أي إصدارات userdebug
وeng
). قبل جمع مسارات Winscope
باستخدام adb
، شغِّل adb root
.
بدءًا من Android 15، تم دمج عمليات تتبُّع Winscope في Perfetto ويتم جمعها باستخدام سطر معالجة Perfetto. كلّ عملية تتبُّع في Winscope هي مصدر بيانات Perfetto مع إعداداته الخاصة. يمكنك تفعيل الإعدادات بشكل فردي أو في جلسة traceding واحدة.
في الإصدار 14 من Android والإصدارات الأقدم، يحتوي كلّ تتبُّع 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
: تتتبّع لقطات حالة فردية عند بدء مصدر data.
اطّلِع على 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، المستخدَم في رمز المصدر لنظام التشغيل Android-
log_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
لهذا نوع
التتبّع.
خيارات الضبط
لا يتضمّن نوع التتبّع هذا خيارات ضبط.
مثال
في ما يلي مثال على نوع تتبُّع انتقال 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
تسجيل عمليات التتبّع في الإصدار 14 من نظام التشغيل Android والإصدارات الأقدم
شغِّل الأمر 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
تتبُّع السجلّ مرة واحدة لكل إطار:
adb shell wm tracing frame
تسجيل كل معاملة:
adb shell wm tracing transaction
اضبط الحد الأقصى لحجم السجلّ (بالكيلوبايت):
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):
ابدأ تتبُّع أسلوب الإدخال لعملاء أسلوب الإدخال وخدمة أسلوب الإدخال وخدمة إدارة أسلوب الإدخال:
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 \