Трассировка системы Android: категории и их назначение

При записи системного трейса на Android через System tracing или утилиту systrace результат напрямую зависит от выбранных категорий: если не включить, например, категорию sched, в отчёте не будет данных о планировании потоков, и найти причину подтормаживаний интерфейса станет заметно сложнее. Категории трассировки определяют, какие именно события ядра, системных служб и приложений попадут в итоговый файл трейса.

В этой статье разберём, что такое категории трассировки, какие из них доступны на Android, как выбрать нужный набор для диагностики производительности и как записать трейс через настройки разработчика или командную строку. Материал ориентирован на разработчиков и продвинутых пользователей, анализирующих работу системы.

Что такое категории трассировки и зачем они нужны

Трассировка системы — это запись событий, происходящих в ядре Linux, системных процессах Android (SurfaceFlinger, system_server) и пользовательских приложениях, за короткий промежуток времени. Каждое событие помечено тегом категории, и при записи можно включать или отключать целые группы событий. Это сделано намеренно: полный захват всех событий создавал бы огромные файлы и заметную нагрузку на устройство.

Категории позволяют сузить сбор данных до конкретной задачи. Диагностируете пропуски кадров — нужны категории графики и планировщика. Анализируете медленный запуск приложения — понадобятся события ActivityManager и ввода-вывода. Правильный выбор категорий экономит время анализа и делает трейс читаемым.

Основные категории трассировки Android

Набор доступных категорий зависит от версии Android и сборки системы, но базовый список стабилен на протяжении многих релизов. Ниже — наиболее часто используемые категории при анализе производительности.

  • 📊 gfx — события графического стека: работа с буферами, SurfaceFlinger, отрисовка кадров.
  • 🧵 sched — планирование потоков в ядре: переключения контекста, приоритеты, загрузка CPU.
  • 🖼️ view — события системы представлений: инфляция layout, measure и layout-проходы.
  • 📱 amActivityManager: запуск и остановка активностей, жизненный цикл приложений.
  • 🪟 wmWindowManager: создание окон, анимации переходов, изменение фокуса.
  • 💾 disk / freq — операции ввода-вывода и изменение частоты процессора.
  • 🔄 sync — синхронизация буферов кадров между процессами.
  • power — события управления питанием: wakelock, переходы в сон.

Полный актуальный список категорий для конкретного устройства можно посмотреть командой atrace --list_categories через ADB — она выводит именно те теги, которые поддерживает ядро и система данного аппарата.

adb shell atrace --list_categories

Как включить трассировку через настройки разработчика

На большинстве устройств с Android 9 и новее встроенный инструмент System tracing доступен прямо в меню разработчика. Сначала нужно активировать режим разработчика: откройте настройки, найдите раздел «О телефоне» и несколько раз нажмите на пункт «Номер сборки» — точный путь может отличаться в зависимости от оболочки производителя.

Далее перейдите в Настройки → Система → Для разработчиков → Трассировка системы (System tracing). Здесь включается запись и выбираются категории. После активации в шторке быстрых настроек появится плитка для старта и остановки записи.

☑️ Запись системного трейса

Выполнено: 0 / 6
⚠️ Внимание: запись трейса создаёт дополнительную нагрузку на систему. Не оставляйте трассировку включённой постоянно — записывайте короткие фрагменты (обычно 10–30 секунд), охватывающие только момент воспроизведения проблемы.

Запись трейса через ADB и Systrace

Альтернативный способ — утилита командной строки. Классический systrace из Android SDK постепенно вытесняется Perfetto, но базовый синтаксис записи через atrace остаётся рабочим. Категории указываются прямо в команде.

adb shell atrace -z -b 10240 gfx view sched am wm -t 10 -o /data/local/tmp/trace.ctrace

Здесь -z включает сжатие, -b задаёт размер буфера в килобайтах, -t — длительность записи в секундах, а далее перечислены категории. Готовый файл выгружается на компьютер командой adb pull и открывается в веб-интерфейсе Perfetto UI (ui.perfetto.dev) или в Chrome Tracing.

Для Perfetto используется конфигурационный файл, где источники данных и категории описываются явно. Это гибче, но требует знакомства с форматом конфигурации — для быстрой разовой диагностики проще встроенный System tracing.

Какие категории выбрать под конкретную задачу

Универсального набора категорий не существует — выбор зависит от симптома. Ниже таблица с типовыми сценариями диагностики.

ПроблемаРекомендуемые категорииЧто искать в трейсе
Пропуски кадров (jank)gfx, view, sched, syncДлинные кадры, превышение лимита vsync
Медленный запуск приложенияam, wm, disk, schedЗадержки в ActivityManager, блокировки I/O
Зависания UI-потокаsched, view, binder_driverДолгие binder-транзакции, ожидание CPU
Быстрый разряд батареиpower, freq, schedЧастые пробуждения, удержание wakelock

Обратите внимание: часть категорий (например, события binder или низкоуровневые события ядра) может быть недоступна на устройствах без root-доступа или на коммерческих прошивках с урезанной конфигурацией. Если нужной категории нет в выводе atrace --list_categories, система её просто не поддерживает.

📊 Какой инструмент трассировки вы используете чаще?
Встроенный System tracing
Systrace через ADB
Perfetto
Android Studio Profiler

Анализ записанного трейса

Записанный файл открывается в Perfetto UI: события отображаются в виде временной шкалы, сгруппированной по процессам и потокам. Каждая строка — это поток, цветные полосы — интервалы выполнения. Состояние потока (Running, Runnable, Sleeping) помогает понять, выполнялся ли код или ждал ресурсов.

Ключевой приём при анализе jank — найти строку SurfaceFlinger или маркеры кадров вашего приложения и посмотреть, какие кадры превысили бюджет времени. Затем внутри проблемного кадра проверяется, какой участок кода занял больше всего времени: отрисовка, layout, сетевой запрос в UI-потоке или ожидание binder-ответа.

⚠️ Внимание: трейс с устройства содержит имена процессов и потоков, а при включённых пользовательских маркерах — и названия секций кода. Не публикуйте файлы трейсов в открытом доступе, если приложение работает с конфиденциальными данными.
Почему в трейсе пусто по нужной категории

Чаще всего категория не была включена при записи, либо события этого типа просто не происходили в окне захвата. Также проверьте, что запись началась до воспроизведения проблемы, и что размер буфера не переполнился — при переполнении старые события затираются.

Типичные ошибки при работе с трассировкой

Самая частая ошибка — запись слишком длинного трейса «на всякий случай». Большой файл труднее анализировать, а кольцевой буфер может перезаписать начало записи. Оптимально — короткий захват, где проблема воспроизводится один-два раза.

Вторая ошибка — включение всех категорий сразу. Трейс становится перегруженным, нагрузка на устройство растёт, и сама запись начинает искажать картину производительности. Третья типичная ситуация — попытка анализировать трейс без понимания, какой симптом ищется: перед записью сформулируйте конкретный вопрос, например «почему пропускаются кадры при скролле списка».

Часто задаваемые вопросы

Чем Perfetto отличается от Systrace?

Perfetto — более новая платформа трассировки, встроенная в Android начиная с Android 10. Она поддерживает более гибкую конфигурацию источников данных, длительные записи и мощный веб-интерфейс анализа. Systrace — старый инструмент с фиксированным набором категорий, который сохраняется для совместимости.

Нужен ли root для записи системного трейса?

Для базовых категорий (gfx, view, sched, am, wm) root не требуется — достаточно режима разработчика и ADB. Часть низкоуровневых событий ядра может быть недоступна без расширенных прав, это зависит от сборки системы конкретного устройства.

Как добавить в трейс события своего приложения?

Используйте методы Trace.beginSection("имя") и Trace.endSection() из Android SDK вокруг интересующего участка кода. Эти маркеры попадут в трейс в категории приложения и будут видны рядом с системными событиями.

Куда сохраняется файл трейса при записи через System tracing?

После остановки записи система показывает уведомление с предложением поделиться файлом — обычно это файл формата .perfetto-trace или .ctrace. Его можно отправить на компьютер и открыть в Perfetto UI.

Почему трейс влияет на производительность устройства?

Запись событий требует работы ядра и системных служб: каждое событие фиксируется в буфере, а при большом числе включённых категорий накладные расходы растут. Поэтому измерения в трейсе всегда немного пессимистичнее реальной работы системы без записи.