Захват следов с помощью команд adb

Вы можете собирать трассировки Winscope с помощью командной строки adb в отладочных сборках (то есть, в сборках userdebug и eng ). Перед сбором трассировок Winscope с помощью adb выполните adb root .

Начиная с Android 15, трассировки Winscope интегрированы в Perfetto и собираются с помощью командной строки Perfetto. Каждая трассировка Winscope представляет собой источник данных Perfetto со своей собственной конфигурацией. Вы можете включать конфигурации по отдельности или в рамках одной сессии трассировки.

В Android 14 и более ранних версиях каждая трассировка Winscope имеет свою собственную команду, и вы можете собирать данные по каждой из них независимо. Дополнительную информацию см. в разделе «Захват трассировок в Android 14 и более ранних версиях» .

Менеджер окон

Для этого типа трассировки используйте имя источника данных 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_DEBUG
  • PROTOLOG_LEVEL_VERBOSE
  • PROTOLOG_LEVEL_INFO
  • PROTOLOG_LEVEL_WARN
  • PROTOLOG_LEVEL_ERROR
  • PROTOLOG_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

ИМЕ

Для этого типа трассировки используйте имя источника данных 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) используются следующие команды:

  1. Запуск трассировки 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 \