ردیابی با دستورات adb

ردیابی های 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 \