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 konfigurasi 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 mengumpulkannya 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: Hanya mencatat elemen yang terlihat, dengan jumlah overhead performa minimum.
  • Frekuensi log (log_frequency): Menentukan frekuensi item yang dicatat ke dalam log:

    • LOG_FREQUENCY_FRAME: Melacak snapshot status saat frame di-commit.
    • LOG_FREQUENCY_TRANSACTION: Melacak 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 melacak 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 ditetapkan, pesan apa pun 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 ke dalam log, 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): Mengaktifkan 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 ditetapkan ke true, akan 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 pelacakan (trace_mode): Menentukan apakah pelacakan input harus dimulai menggunakan aturan perlindungan privasi atau mencatat semua peristiwa input:

  • TRACE_MODE_TRACE_ALL: Mencatat semua peristiwa input yang diproses oleh sistem, terlepas dari konteks tempat peristiwa tersebut diproses.
  • 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 item dicatat ke dalam log:

  • MODE_ACTIVE: Melacak snapshot lapisan. Snapshot diambil setiap kali lapisan berubah.
  • MODE_GENERATED: Membuat snapshot lapisan dari transaksi yang disimpan di buffer ring internal SurfaceFlinger. Pembuatan snapshot lapisan terjadi saat sumber data ini dihapus.
  • 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 dihapus.

Flag trace (trace_flags):

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

  • TRACE_FLAG_HWC: Melacak metadata komposer hardware tidak terstruktur tambahan.

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

  • 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 item dicatat ke dalam log:

  • MODE_CONTINUOUS: SurfaceFlinger menulis buffer ring internal transaksi setiap kali sumber data dihapus. Buffer ring 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 beberapa 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.

Pelacakan WindowManager

Untuk merekam aktivitas WindowManager:

  • Mengaktifkan 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 ke dalam log sekali per frame:

    adb shell wm tracing frame
    
  • Catat setiap transaksi:

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

    adb shell wm tracing size
    
  • Mencetak status rekaman aktivitas:

    adb shell wm tracing status
    
  • Tetapkan level 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...]
    
  • Nonaktifkan 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
    

Pelacakan (lapisan) SurfaceFlinger

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

Lihat contoh konfigurasi berikut untuk pelacakan 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 pelacakan untuk lapisan SurfaceFlinger:

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

Dump SurfaceFlinger (lapisan)

Untuk mengambil 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 pelacakan IME untuk klien Metode Input (IM), Layanan Metode Input (IMS), dan Layanan Pengelolaan Metode Input (IMMS):

    adb shell ime tracing start
    
  • Mulai melacak 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 mengetahui informasi konfigurasi.

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

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 pelacakan transaksi SurfaceFlinger:

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