Merekam aktivitas dengan perintah adb

Rekaman aktivitas Winscope dapat dikumpulkan dengan command line adb pada build debug (yaitu, build userdebug dan eng). Sebelum mengumpulkan rekaman aktivitas Winscope dengan adb, jalankan adb root.

Mulai Android 15, rekaman aktivitas Winscope diintegrasikan ke dalam Perfetto dan dikumpulkan menggunakan command line Perfetto. Setiap rekaman aktivitas Winscope adalah sumber data Perfetto dengan konfigurasinya sendiri. Anda dapat mengaktifkan konfigurasi satu per satu atau dalam satu sesi pelacakan.

Di Android 14 dan yang lebih lama, setiap rekaman aktivitas Winscope memiliki perintah yang berbeda dan Anda dapat mengumpulkan setiap rekaman aktivitas secara terpisah. Lihat Merekam rekaman aktivitas di Android 14 dan yang lebih lama untuk mengetahui informasi selengkapnya.

WindowManager

Gunakan nama sumber data android.windowmanager untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

  • Tingkat log (log_level): Menentukan panjang log. Nilai yang didukung:

    • LOG_LEVEL_VERBOSE: Mencatat semua elemen dengan jumlah informasi maksimum.
    • LOG_LEVEL_DEBUG: Mencatat semua elemen, tetapi tidak menulis semua data konfigurasi.
    • LOG_LEVEL_CRITICAL: Mencatat elemen yang terlihat saja, dengan overhead performa minimum.
  • Frekuensi log (log_frequency): Menentukan frekuensi pencatatan item:

    • LOG_FREQUENCY_FRAME: Melacak snapshot status saat frame dilakukan.
    • LOG_FREQUENCY_TRANSACTION: Mencatat snapshot status setiap kali transaksi dilakukan.
    • LOG_FREQUENCY_SINGLE_DUMP: Melacak snapshot status tunggal saat sumber data dimulai.

Lihat WindowManager untuk mengetahui detail tentang nilai konfigurasi.

Contoh

Berikut adalah contoh jenis rekaman aktivitas WindowManager untuk 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

Gunakan nama sumber data android.protolog untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Mode pelacakan (tracing_mode): Menentukan konfigurasi log yang akan digunakan:

  • DEFAULT: Hanya mencatat grup dan level log yang ditentukan dalam group_overrides.
  • ENABLE_ALL: Melacak semua grup dan level log, kecuali jika ditentukan dalam group_overrides.

Level log minimum (default_log_from_level): Jika disetel, setiap pesan dengan level log yang lebih tinggi dari dan termasuk level ini akan dilacak, kecuali jika penggantian grup ditentukan. Misalnya, ini digunakan untuk mengaktifkan semua peringatan dan error agar dicatat, tanpa harus mengaktifkan semua log. Nilai yang didukung adalah:

  • PROTOLOG_LEVEL_DEBUG
  • PROTOLOG_LEVEL_VERBOSE
  • PROTOLOG_LEVEL_INFO
  • PROTOLOG_LEVEL_WARN
  • PROTOLOG_LEVEL_ERROR
  • PROTOLOG_LEVEL_WTF

Penggantian grup (group_overrides): Memungkinkan konfigurasi manual level log untuk setiap grup ProtoLog. Setiap grup berisi:

  • name: Nama grup ProtoLog, yang digunakan dalam kode sumber Android.
  • log_from: Sama seperti default_log_from_level, tetapi hanya ditentukan untuk grup saat ini.
  • collect_stacktrace: Jika disetel ke true, mengumpulkan stack trace untuk setiap pesan ProtoLog dalam grup yang dilacak.

Contoh

Berikut adalah contoh jenis rekaman aktivitas ProtoLog untuk 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

Input

Gunakan nama sumber data android.input.inputevent untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Mode rekaman aktivitas (trace_mode): Menentukan apakah rekaman aktivitas input harus dimulai menggunakan aturan yang menjaga privasi atau mencatat semua peristiwa input:

  • TRACE_MODE_TRACE_ALL: Mencatat semua peristiwa input yang diproses oleh sistem, terlepas dari konteks pemrosesannya.
  • TRACE_MODE_USE_RULES: Menggunakan aturan pelacakan yang ditentukan dalam konfigurasi ini untuk menentukan peristiwa yang akan dilacak. Lihat android_input_event_config.proto untuk mengetahui informasi selengkapnya tentang cara menentukan aturan untuk rekaman aktivitas.

Contoh

Berikut adalah contoh jenis rekaman aktivitas input untuk 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 (lapisan)

Gunakan nama sumber data android.surfaceflinger.layers untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Mode pelacakan (mode): Menentukan frekuensi pencatatan item:

  • MODE_ACTIVE: Melacak snapshot lapisan. Snapshot diambil setiap kali terjadi perubahan lapisan.
  • MODE_GENERATED: Membuat snapshot lapisan dari transaksi yang disimpan dalam buffer ring internal SurfaceFlinger. Pembuatan snapshot lapisan terjadi saat sumber data ini dibersihkan.
  • MODE_DUMP: Melacak snapshot satu lapisan.
  • MODE_GENERATED_BUGREPORT_ONLY: Sama seperti MODE_GENERATED, tetapi memicu pembuatan snapshot lapisan hanya saat laporan bug diambil, bukan setiap kali rekaman aktivitas dibersihkan.

Flag rekaman aktivitas (trace_flags):

  • TRACE_FLAG_INPUT: Jika permukaan berisi data input, melacak spesifikasi jendela input.
  • TRACE_FLAG_COMPOSITION: Melacak jenis komposisi dan wilayah yang terlihat.
  • TRACE_FLAG_EXTRA: Melacak metadata permukaan tambahan, termasuk lapisan di luar layar.

  • TRACE_FLAG_HWC: Melacak metadata tambahan composer hardware yang tidak terstruktur.

  • TRACE_FLAG_BUFFERS: Mengonfigurasi SurfaceFlinger untuk melacak semua perubahan buffer di platform. Secara default, SurfaceFlinger hanya merekam status baru saat terjadi perubahan geometri.

  • TRACE_FLAG_VIRTUAL_DISPLAYS: Menyertakan lapisan tampilan virtual dalam rekaman aktivitas.

Contoh

Berikut adalah contoh jenis rekaman aktivitas SurfaceFlinger untuk 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

Lihat SurfaceFlinger untuk mengetahui detail tentang arti berbagai nilai konfigurasi.

Transisi shell

Gunakan nama sumber data com.android.wm.shell.transition untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Jenis rekaman aktivitas ini tidak memiliki opsi konfigurasi.

Contoh

Berikut adalah contoh jenis rekaman aktivitas transisi shell untuk 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 (transaksi)

Gunakan nama sumber data android.surfaceflinger.transactions untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Mode pelacakan (mode): Menentukan frekuensi pencatatan item:

  • MODE_CONTINUOUS: SurfaceFlinger menulis buffer ring internalnya untuk transaksi setiap kali sumber data dibersihkan. Ring buffer berisi status awal SurfaceFlinger dan transaksi terbaru.

  • MODE_ACTIVE: SurfaceFlinger menulis status awal, lalu setiap transaksi masuk hingga sumber data dihentikan.

Contoh

Berikut adalah contoh jenis rekaman aktivitas transaksi SurfaceFlinger untuk 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

Gunakan nama sumber data: android.inputmethod untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Jenis rekaman aktivitas ini tidak memiliki opsi konfigurasi.

Contoh

Berikut adalah contoh jenis rekaman aktivitas IME untuk 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

Gunakan nama sumber data android.viewcapture untuk jenis rekaman aktivitas ini.

Opsi konfigurasi

Jenis rekaman aktivitas ini tidak memiliki opsi konfigurasi.

Contoh

Berikut adalah contoh jenis rekaman aktivitas ViewCapture untuk 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

Contoh lengkap

Perfetto memungkinkan Anda mengumpulkan data dari berbagai sumber dalam satu konfigurasi. Anda dapat mengumpulkan semua rekaman aktivitas Winscope dengan satu perintah:

$ 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

Merekam rekaman aktivitas di Android 14 dan yang lebih lama

Jalankan adb root sebelum menjalankan perintah adb shell untuk setiap rekaman aktivitas berikut. Di akhir rekaman aktivitas, file rekaman aktivitas tersedia di /data/misc/wmtrace. Untuk menyalin file atau direktori beserta subdirektorinya dari perangkat, lihat Menyalin file ke dan dari perangkat.

Rekaman aktivitas WindowManager

Untuk merekam aktivitas WindowManager:

  • Aktifkan rekaman aktivitas:

    adb shell wm tracing start
    
  • Menonaktifkan rekaman aktivitas:

    adb shell wm tracing stop
    
  • Menyimpan data logging ke file saat menjalankan pengambilan rekaman aktivitas:

    adb shell wm tracing save-for-bugreport
    
  • Mencatat aktivitas sekali per frame:

    adb shell wm tracing frame
    
  • Mencatat setiap transaksi:

    adb shell wm tracing transaction
    
  • Tetapkan ukuran log maksimum (dalam KB):

    adb shell wm tracing size
    
  • Status rekaman aktivitas cetak:

    adb shell wm tracing status
    
  • Tetapkan tingkat log ke critical (hanya jendela yang terlihat dengan informasi yang dikurangi), trim (semua jendela dengan informasi yang dikurangi), atau all (semua jendela dan informasi):

    adb shell wm tracing level
    

Dump WindowManager

Untuk merekam dump WindowManager:

adb exec-out dumpsys window --proto > window_dump.winscope

ProtoLog

Perintah berikut digunakan untuk sistem ProtoLog.

Dalam proses system_server:

  • Mulai ProtoLog:

    adb shell cmd window logging start
    
  • Hentikan ProtoLog:

    adb shell cmd window logging stop
    
  • Aktifkan ProtoLog untuk grup log tertentu:

    adb shell cmd window logging enable [group...]
    
  • Nonaktifkan ProtoLog untuk grup log tertentu:

    adb shell cmd window logging disable [group...]
    
  • Aktifkan logging Logcat untuk grup log tertentu:

    adb shell cmd window logging enable-text [group...]
    
  • Menonaktifkan logging Logcat untuk grup log tertentu:

    adb shell cmd window logging disable-text [group...]
    

Di WMShell:

  • Mulai ProtoLog:

    adb shell dumpsys activity service SystemUIService WMShell
    

Rekaman aktivitas SurfaceFlinger (lapisan)

Pelacakan lapisan SurfaceFlinger menggunakan rekaman aktivitas Perfetto untuk pengambilan. Lihat Konfigurasi rekaman aktivitas untuk informasi konfigurasi.

Lihat contoh konfigurasi berikut untuk perekaman aktivitas lapisan 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
        }
    }
}

Lihat contoh perintah berikut untuk membuat rekaman aktivitas untuk lapisan SurfaceFlinger:

adb shell -t perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \

Dump SurfaceFlinger (lapisan)

Untuk merekam dump SurfaceFlinger:

adb exec-out dumpsys SurfaceFlinger --proto > sf_dump.winscope

Transisi shell

Perintah berikut digunakan untuk pelacakan transisi.

Dalam proses system_server:

  • Mulai rekaman aktivitas:

    adb shell cmd window shell tracing start
    
  • Menghentikan rekaman aktivitas:

    adb shell cmd window shell tracing stop
    
  • Mulai perekaman aktivitas di WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing start
    
  • Menghentikan perekaman aktivitas di WMShell:

    adb shell dumpsys activity service SystemUIService WMShell transitions tracing stop
    

IME

Perintah berikut digunakan untuk pelacakan Editor Metode Input (IME):

  • Mulai perekaman aktivitas IME untuk klien Metode Input (IM), Layanan Metode Input (IMS), dan Layanan Pengelolaan Metode Input (IMMS):

    adb shell ime tracing start
    
  • Mulai pelacakan klien IME, IMS, dan IMMS:

    adb shell ime tracing stop
    

SurfaceFlinger (transaksi)

Pelacakan transaksi SurfaceFlinger menggunakan rekaman aktivitas Perfetto untuk pengambilan. Lihat Konfigurasi rekaman aktivitas untuk informasi konfigurasi.

Lihat contoh konfigurasi Perfetto berikut untuk pelacakan aktifSurfaceFlinger:

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

Lihat contoh konfigurasi Perfetto berikut untuk pelacakan berkelanjutan 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
        }
    }
}

Lihat contoh perintah berikut untuk membuat rekaman aktivitas transaksi SurfaceFlinger:

    adb shell perfetto \
    -c - --txt \
    -o /data/misc/perfetto-traces/trace \