يمكن جمع عمليات تتبُّع 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، ويُستخدم في رمز المصدر لنظام التشغيل 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
لنوع التتبُّع هذا.
خيارات الإعداد
لا يتضمّن نوع التتبُّع هذا أي خيارات إعداد.
مثال
في ما يلي مثال على نوع تتبُّع انتقال واجهة المستخدم لـ 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
تسجيل تتبُّع السجلّ مرة واحدة لكل إطار:
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):
ابدأ تتبُّع محرر أسلوب الإدخال (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 \