میتوانید ردپاهای 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_DEBUGPROTOLOG_LEVEL_VERBOSEPROTOLOG_LEVEL_INFOPROTOLOG_LEVEL_WARNPROTOLOG_LEVEL_ERRORPROTOLOG_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 shell برای هریک از ردیابیهای زیر،
adb root را اجرا کنید. در پایان ردیابی، فایلهای ردیابی در /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 \