Трассировки 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
Протолог
Для этого типа трассировки используйте имя источника данных 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
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
ПросмотрЗахват
Для этого типа трассировки используйте имя источника данных 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 root
перед выполнением команд adb shell
для каждой из следующих трассировок. В конце трассировки файлы трассировки доступны в /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 .
В процессе system_server
:
Запускаем Протолог:
adb shell cmd window logging start
Остановить Протолог:
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...]
В WMSell:
Запускаем Протолог:
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
Для трассировки редактора метода ввода (IME) используются следующие команды:
Запустите трассировку 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 \