FrameHUD нужен для первого разбора: открыть экран и сразу увидеть jank, p95 и медленную стадию кадра. Остальные инструменты отвечают на другие вопросы: подтверждают регрессию, находят точную причину или показывают масштаб проблемы после релиза.
| Инструмент | Когда полезен |
|---|---|
| FrameHUD | Ручная разработка и QA. Показывает FPS, jank, перцентили и стадии кадра прямо поверх приложения. |
| JankStats | Нужен собственный сбор per-frame данных. Даёт длительность, признак jank и состояние UI; хранение и агрегацию приложение делает само. |
| Macrobenchmark | Проверка регрессий на CI. Повторяет сценарий в близкой к release сборке и выдаёт P50/P90/P95/P99, overrun и trace каждой итерации. |
| Perfetto | Точный разбор плохого кадра. Показывает потоки, scheduler, Binder, GC, RenderThread, GPU и SurfaceFlinger на одной временной шкале. |
| Play Vitals | Статистика после релиза: slow и frozen frames, перцентили и затронутые сессии на реальных устройствах. |
FrameHUD ещё и сравнивает прогон с базлайном прошлых прогонов на том же устройстве, так что регрессию видно уже на QA-проходе. Macrobenchmark это не заменяет: он повторяет фиксированный сценарий на сборке, близкой к релизной, а FrameHUD меряет то, что в прогоне и происходило.
JankStats ближе всего к FrameHUD: на API 24+ оба используют FrameMetrics. Разница в готовности.
JankStats отдаёт события каждого кадра, а FrameHUD сразу собирает из них панель, статистику экрана и
сессии, события и jank gate для instrumentation-тестов. framehud-metrics убирает панель и
оставляет всё остальное. Это самый близкий к JankStats вариант FrameHUD.
frameBudgetsMs ставит
на его место число, которое выбрали вы, и о нём не знает ни один другой инструмент.reportFullyDrawn, что и time to full display у Macrobenchmark, но на ручном проходе, а не на
повторяемом холодном старте. На остальных экранах его закрывает вызов FrameHud.reportUsable(),
и где его поставить — решает приложение.Поэтому P95 из FrameHUD не стоит напрямую сравнивать с P95 из Macrobenchmark. Надёжнее смотреть, как одна метрика меняется в одном инструменте при одинаковых условиях.
framehud:* — рядом с его собственными счётчиками и теми, что вело приложение. И
кольцевой trace не нужно останавливать руками в нужный момент: инцидент сам просит его сохранить
секунды вокруг себя.JankStats стоит отдельно: он нужен, если приложение собирает собственную performance-телеметрию.
FrameHUD не изобретает тайминги: большую часть отдаёт Android через FrameMetrics, а FrameHUD кладёт
их туда, куда вы и так смотрите во время работы. Для точного benchmark, системного расследования и
production-статистики остаются отдельные инструменты.