ردیابی های Winscope را می توان با خط فرمان adb
در ساخت های اشکال زدایی (یعنی userdebug
و eng
builds) جمع آوری کرد. قبل از جمع آوری ردیابی های Winscope با adb
، adb root
اجرا کنید.
با شروع اندروید 15، ردپای Winscope در Perfetto یکپارچه شده و با استفاده از خط فرمان Perfetto جمع آوری می شود. هر ردیابی Winscope یک منبع داده Perfetto با پیکربندی خاص خود است. می توانید پیکربندی ها را به صورت جداگانه یا در یک جلسه ردیابی فعال کنید.
در اندروید 14 و پایین تر، هر Trace Winscope دستور متفاوتی دارد و می توانید هر کدام را به طور مستقل جمع آوری کنید. برای اطلاعات بیشتر به ضبط ردیابی در اندروید 14 و پایینتر مراجعه کنید.
WindowManager
از نام منبع داده android.windowmanager
برای این نوع ردیابی استفاده کنید.
گزینه های پیکربندی
Log level (
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 که در کد منبع اندروید استفاده می شود. -
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
ردیابی در اندروید 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 logging را برای گروه های گزارش داده شده فعال کنید:
adb shell cmd window logging enable-text [group...]
غیرفعال کردن Logcat logging برای گروه های گزارش داده شده:
adb shell cmd window logging disable-text [group...]
در WMSell:
شروع ProtoLog:
adb shell dumpsys activity service SystemUIService WMShell
آثار SurfaceFlinger (لایه ها)
ردیابی لایه SurfaceFlinger از Trace Perfetto برای ضبط استفاده می کند. برای اطلاعات پیکربندی به پیکربندی Trace مراجعه کنید.
مثال زیر از یک پیکربندی برای ردیابی لایه 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:
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
شروع یک ردیابی در WMSell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
توقف یک ردیابی در WMSell:
adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
IME
دستورات زیر برای ردیابی Input Method Editor (IME) استفاده می شود:
ردیابی IME را برای مشتریان روش ورودی (IM)، سرویس روش ورودی (IMS) و سرویس مدیریت روش ورودی (IMMS) شروع کنید:
adb shell ime tracing start
ردیابی مشتریان IME، IMS و IMMS را شروع کنید:
adb shell ime tracing stop
SurfaceFlinger (معاملات)
ردیابی تراکنش SurfaceFlinger از Trace Perfetto برای ضبط استفاده می کند. برای اطلاعات پیکربندی به پیکربندی Trace مراجعه کنید.
مثال زیر از پیکربندی 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 \