Systrace — это инструмент системной трассировки Android, который собирает данные о работе ядра Linux, процессора, графического ускорителя и всех процессах системы за короткий промежуток времени. В отличие от Traceview, который фокусируется на методах внутри приложения, Systrace показывает системную картину: загрузку каждого ядра CPU, работу SurfaceFlinger, Binder-вызовы и GC-циклы. По данным Google, 2024, инструмент незаменим для диагностики пропущенных кадров, частых сборок мусора и аномалий в UI-потоке.
Главное
Systrace — это утилита командной строки из Android SDK, которая захватывает и объединяет данные из нескольких источников трассировки ядра (ftrace) и пользовательского пространства (atrace) в единый HTML-отчёт. Инструмент появился в Android 4.1 (Jelly Bean) как замена старой утилите traceview для системного профилирования и долгое время оставался стандартным средством диагностики производительности на платформе Android.
Systrace полагается на ftrace — механизм трассировки ядра Linux, доступный в Android начиная с версии 4.1. При запуске Systrace активирует заданные категории трейсов: sched (планировщик задач), freq (частота CPU), idle (состояния простоя), workq (рабочие очереди), binder, gfx и другие. Данные собираются в кольцевой буфер ядра и после остановки дампа объединяются в единый файл trace.html, который открывается в любом браузере.
Начиная с Android Studio 3.1, Systrace встроен в CPU Profiler. В режиме "Trace System Calls" профайлер запускает Systrace на подключённом устройстве и отображает результаты прямо в окне Android Studio. Это избавляет от необходимости работать с командной строкой для базовых случаев, но при этом сохраняет полный функционал — все категории трейсов, фильтрацию и интерактивный таймлайн. Производительность устройства во время трассировки снижается незначительно, так как ftrace спроектирован для минимального оверхеда.
Systrace использует два механизма сбора данных: ftrace на уровне ядра для системных событий и atrace в пользовательском пространстве для Android-специфичных меток. ftrace регистрирует переключения контекста (sched_switch), изменения частоты CPU (cpu_frequency), прерывания (irq_handler_entry) и другие события. atrace добавляет метки из Android-фреймворка — начало и конец отрисовки кадра, вызовы SurfaceFlinger и Binder-транзакции.
Ключевая возможность Systrace — визуализация цепочки отрисовки каждого кадра: приложение → BufferQueue → SurfaceFlinger → HWC (composer) → Display. Если на каком-то этапе возникает задержка, Systrace показывает точную причину: приложение не успело подготовить буфер, SurfaceFlinger ждал VSync или HWC не смог скомпоновать слои. Frame Lifecycle на таймлайне раскрашен по статусам: зелёный (вовремя), жёлтый (задержка), красный (пропуск). Эта визуализация — основной инструмент для оптимизации UI-производительности.
Systrace поддерживает более 20 категорий трейсов, каждая из которых включает набор связанных событий. Важные категории: gfx (отрисовка графики), input (обработка ввода), view (система View), webview (WebView), power (энергопотребление), hal (аппаратная абстракция). Для профилирования игр полезна категория gfx детализация до GPU команд через AGI (Android GPU Inspector).
Systrace предоставляет уникальный для Android набор возможностей, которые недоступны в других профайлерах: системный таймлайн, метрики на уровне ядра и автоматическое обнаружение проблем.
HTML-отчёт Systrace содержит многоуровневый таймлайн, где каждая дорожка соответствует одному процессу или потоку. Можно приближать и отдалять временную шкалу, кликать на события для просмотра деталей (длительность, процесс-инициатор, дополнительные аргументы). Цветовая кодировка помогает быстро ориентироваться: зелёные блоки — работа процесса, синие — ожидание, оранжевые — прерывание, белые — простой.
Systrace автоматически анализирует трейс и выводит Alert-сообщения с указанием проблемных мест. Например: "Buffer underrun — SurfaceFlinger не успел получить буфер до VSync" или "Long Binder transaction — 42 мс в потоке Binder_1". Каждая alert содержит ссылку на соответствующий участок таймлайна и рекомендацию по исправлению. Это экономит часы ручного анализа и является одной из главных причин использовать Systrace вместо ручного логирования.
Разработчик может добавлять собственные метки в Systrace-трейс через API Trace.beginSection и Trace.endSection. Это позволяет проследить выполнение критических участков кода прямо на системном таймлайне — например, отметить начало и конец загрузки данных или расчёта макета. Метки отображаются как отдельные блоки на дорожке приложения и видны рядом с системными событиями.
| Категория | Данные | Типичное применение |
|---|---|---|
| sched | Переключения контекста, idle-состояния | Блокировки потоков, contention |
| gfx | VSync, подготовка буфера, HWC | Frame drops, jank |
| binder | Binder-транзакции, latency | IPC-задержки, remote calls |
| freq | Частота CPU, scaling governor | Троттлинг, энергопотребление |
| gfx + AGI | GPU-команды, шейдеры | Игровая производительность |
Запуск Systrace возможен двумя способами: через Android Studio CPU Profiler (режим "Trace System Calls") или через командную строку с помощью python-скрипта systrace.py из папки platform-tools. Каждый способ имеет свои сценарии применения.
Подключите устройство, откройте Profiler (View → Tool Windows → Profiler), выберите ваш процесс, перейдите на вкладку CPU, выберите режим "Trace System Calls" и нажмите Record. Через 5–30 секунд нажмите Stop — Android Studio запустит Systrace на устройстве, дождётся завершения и загрузит результат. Ограничение: запись возможна только пока открыт Profiler, что неудобно для долгих сценариев или автоматизации.
Для более гибкого контроля используйте скрипт systrace.py. Укажите категории трейсов, длительность и имя выходного файла. Пример: захват данных gfx, input и sched на 10 секунд. Для запуска требуется Python 2.7+ и подключённое устройство с USB-отладкой. На Android 12+ Systrace заменён на Perfetto — команда остаётся прежней, но скрипт перенаправляет вызовы в perfetto.
# Базовый запуск systrace на 10 секунд
$ python systrace.py \
--time=10 \
-o trace.html \
gfx input sched
# Только категория gfx для анализа UI
$ python systrace.py \
--time=5 \
-t gfx \
-o ui_trace.html
Чтобы ваш код появился на Systrace-таймлайне, оберните критический участок в Trace.beginSection / Trace.endSection. Важно, чтобы beginSection и endSection были строго парными — иначе Systrace покажет некорректный таймлайн. В Kotlin удобно использовать inline-extension, чтобы гарантировать закрытие секции даже при исключении.
import android.os.Trace
fun traceSection(name: String, block: () -> Unit) {
Trace.beginSection(name)
try {
block()
} finally {
Trace.endSection()
}
}
// Использование в коде
traceSection("load_screen_data") {
fetchData()
updateUI()
}
Отчёт Systrace — это самодостаточный HTML-файл, который можно открыть в Chrome, Edge или Firefox. Он содержит интерактивный таймлайн, панель выбора процессов, список alert-сообщений и ключевые метрики (frame rate, CPU usage, binder transactions). Понимание структуры отчёта — ключевой навык для эффективного профилирования.
Таймлайн отображает время слева направо. Каждый процесс и поток — отдельная дорожка. Клавиши W/S приближают/отдаляют, A/D перемещают по времени. Выделите область мышью для увеличения участка. VSync-линии показывают границы кадров (каждые 16.6 мс при 60 FPS). Если между двумя VSync-линиями не влезает полный цикл отрисовки — кадр пропущен. Обращайте внимание на дорожку SurfaceFlinger: если она долго занята (оранжевый блок), значит, композиция слоёв тормозит общую отрисовку.
Панель Alerts в левой части отчёта содержит автоматически обнаруженные проблемы. Каждая alert кликабельна — при клике таймлайн перемещается к проблемному моменту. Самые частые alert: "Long Sync" (долгая синхронизация потока), "Scheduling Delay" (задержка планировщика), "Buffer Overrun" (переполнение буфера SurfaceFlinger). Если alert показывает значение у 100 мс для Scheduling Delay, это прямо указывает на то, что UI-поток ждал CPU из-за фоновой нагрузки — нужно перенести тяжёлые вычисления в Worker Thread.
Для анализа пропущенных кадров включите дорожки SurfaceFlinger и app.gfx. Каждый кадр отображается как прямоугольник: зелёный (≤16 мс), жёлтый (16–32 мс), красный (>32 мс). Если вы видите красный прямоугольник на дорожке приложения, кликните на него — Systrace покажет, какой именно метод (или системный вызов) превысил лимит. По данным Google (Android Performance Patterns, 2023), 70% jank-проблем вызваны долгим onBindViewHolder или частым GC.
Perfetto — это преемник Systrace, представленный Google в Android 9 (Pie) как экспериментальный инструмент и ставший основным начиная с Android 12. Perfetto использует современный прото-буферный формат данных, поддерживает длительные сессии (часы вместо секунд) и имеет Web UI для просмотра трейсов. Разберём ключевые отличия двух систем.
| Критерий | Systrace | Perfetto |
|---|---|---|
| Формат | HTML-отчёт (trace.html) | Proto-буфер (.trace / .perfetto-trace) |
| Длительность | До 60 секунд | Часы, гигабайты данных |
| Интерфейс | Встроенный HTML | Web UI (ui.perfetto.dev) |
| Категории | Фиксированные (ftrace + atrace) | Расширяемые (SQL-запросы к трейсу) |
| Мобильность | Только Android | Android, Linux, Chrome, Windows |
Несмотря на переход на Perfetto, навык работы с Systrace остаётся актуальным: на устройствах до Android 11 он используется по умолчанию, а Perfetto сохраняет обратную совместимость со Systrace-категориями. В Android Studio CPU Profiler использует Perfetto для новых устройств и Systrace для старых — прозрачно для пользователя. Для CI/CD рекомендуется использовать Perfetto, так как его формат поддаётся автоматической обработке через Python и SQL.
Для практического освоения Systrace рассмотрим два сценария: поиск причины пропущенных кадров при скролле и диагностика частых GC, которые блокируют UI-поток.
Запустите Systrace с категорией gfx на 10 секунд, прокрутите список в приложении. В отчёте найдите участки с красными кадрами. Кликните на проблемный кадр и посмотрите дорожку app — если там блок "inflateLayout" или "onBindViewHolder" шириной >16 мс, проблема в раздутии макета или привязке данных. Решение: оптимизируйте макет (reduce deep ViewGroup, ViewStub), вынесите загрузку изображений в Glide с onAttachedToWindow.
Systrace с категорией freq и sched позволяет увидеть, как часто GC-циклы вытесняют UI-поток. Найдите дорожку приложения на таймлайне — если вы видите периодические блоки длительностью 20–50 мс с именем "Concurrent GC", значит, сборщик мусора работает слишком часто. Добавьте категорию "dalvik" для детального анализа. Решение: конвертируйте Bitmap в ByteBuffer, используйте пул объектов (ObjectPool) для частых аллокаций, уменьшите фрагментацию хипа через аргумент ART.
# Запуск с категориями для анализа UI + GC
$ python systrace.py \
--time=15 \
-o gc_analysis.html \
gfx sched dalvik freq
# Захват с длиной 30 секунд для воспроизводимого теста
$ python systrace.py \
--time=30 \
--app=com.example.app \
-o app_trace.html
Часто задаваемые вопросы
Да, для запуска Systrace не требуется root-доступ. Инструмент использует atrace, который доступен на любом устройстве с включённой USB-отладкой. Некоторые категории (power, freq) могут требовать подписи системы, но основные (gfx, sched, input) работают на всех устройствах.
Ограничение в 60 секунд связано с объёмом кольцевого буфера ftrace — при длительной записи буфер перезаписывается. Perfetto снимает это ограничение: можно записывать часы и получать трейсы размером до нескольких гигабайт с передачей по USB или потоковой записью на диск.
Возможные причины: приложение не переведено в debuggable-режим, не добавлен флаг android:debuggable="true" в манифесте, или используется релизная сборка. Также проверьте, что в категориях указан --app=com.example.app — иначе Systrace захватывает только системные процессы.
Для C++ используйте ATRACE_BEGIN и ATRACE_END из библиотеки libcutils. Подключите заголовочный файл и оберните нужный участок. Метка появится в Systrace на дорожке вашего процесса, что особенно полезно для анализа игровых движков (Unity, Unreal).
На Android 12 и выше используйте Perfetto. Установите perfetto-агент на устройство через ADB, запустите запись в JSON-формате. Для быстрого просмотра используйте Perfetto Web UI (ui.perfetto.dev), а для CI — командный экспорт с TraceProcessor на Python.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также