Android отрисовывает пользовательский интерфейс, генерируя кадр из вашего приложения и отображая его на экране. Если ваше приложение страдает от медленной отрисовки пользовательского интерфейса, система вынуждена пропускать кадры. В этом случае пользователь наблюдает повторяющееся мерцание на экране, которое называется «рывками» .
Когда возникают рывки, это обычно происходит из-за замедления или блокирующего асинхронного вызова в потоке пользовательского интерфейса (в большинстве приложений это основной поток). Вы можете использовать системную трассировку, чтобы определить, где находится проблема.
Если вы используете Jetpack Compose, лучший способ исследовать производительность рендеринга в трассировке — включить трассировку композиции . Чтобы узнать о распространенных проблемах с производительностью Compose, см. раздел «Производительность Jetpack Compose» .
Для приложений, использующих Compose, следуйте инструкциям в этом руководстве, если вам нужен общий обзор вашего приложения. Представленные здесь системные трассировки помогут вам выявить задержки, вызванные системными проблемами, блокирующими основной поток, такими как интенсивный дисковый ввод-вывод, агрессивная сборка мусора или узкие места рендеринга на графическом процессоре. Используйте руководство по производительности Jetpack Compose, если вы определили, что задержка связана с уровнем пользовательского интерфейса. Это руководство поможет вам исправить специфические для Compose неэффективности, такие как чрезмерное количество перекомпозиций, чтение состояния на неправильном этапе или использование нестабильных параметров.
Обнаружение зависаний на Android 12 и выше.
Для устройств, использующих Android 12 (уровень API 31) или выше, захваченная трассировка отображается в разделе «Некорректные кадры» в панели «Дисплей» в профилировщике ЦП.
Для обнаружения сбоев,
В Android Studio выберите View > Tool Windows > Profiler или нажмите Profile.
на панели инструментов.Если появится диалоговое окно «Выбор целевого устройства развертывания» , выберите устройство, на которое будет развернуто ваше приложение для профилирования. Если вы подключили устройство через USB, но оно не отображается в списке, убедитесь, что отладка по USB включена .
Чтобы открыть профилировщик ЦП, щелкните в любом месте временной шкалы ЦП .
В меню настроек профилировщика ЦП выберите «Трассировка системы» и нажмите «Запись» . После завершения работы с приложением нажмите «Остановить» .
В разделе «Дисплей» вы должны увидеть дорожку «Нестабильные кадры» . По умолчанию профилировщик отображает в качестве кандидатов для исследования только нестабильные кадры. Внутри каждого нестабильного кадра красная область выделяет время, которое кадр проходит после истечения крайнего срока рендеринга.

Как только вы обнаружите проблемный кадр, щелкните по нему; при желании вы можете нажать клавишу M , чтобы настроить масштаб и сфокусироваться на выбранном кадре. Соответствующие события выделены в следующих потоках: основной поток, поток рендеринга и завершение работы графического процессора .

При желании вы можете просмотреть все кадры или разбивку времени рендеринга, установив флажки «Все кадры» и «Жизненный цикл» соответственно.

Обнаружение зависаний на Android 11
Для устройств, использующих Android 11 (уровень API 30), захваченная трассировка отображается в разделе «Жизненный цикл кадра» в профилировщике ЦП.

Раздел «Жизненный цикл кадра» содержит название слоя и четыре дорожки. Каждая дорожка представляет собой один этап конвейера рендеринга кадра. Элементы раздела « Жизненный цикл кадра» следующие:
- Жизненный цикл кадра (название слоя) : Заголовок раздела содержит название слоя в скобках. Слой — это отдельная единица композиции.
- Приложение : Этот трек показывает время от момента извлечения буфера из очереди приложением до момента его повторного добавления в очередь. Обычно это соответствует событиям трассировки в
RenderThread. - Ожидание GPU : Этот параметр показывает, как долго буфер находился в распоряжении GPU. Это время от момента отправки буфера на GPU до момента завершения работы GPU над буфером. Это не означает, что GPU работал только с этим буфером в течение этого времени. Для получения подробной информации о том, над чем работает GPU в течение заданного времени, вы можете использовать Android GPU Inspector .
- Композиция : На этом графике отображается время от момента, когда SurfaceFlinger подключается к буферу и отправляет его на композицию, до момента отправки буфера на дисплей.
- Количество отображаемых кадров : Этот индикатор показывает, сколько времени кадр находился на экране.
В разделе « Жизненный цикл кадра» показано, как буфер кадра перемещается между различными этапами конвейера рендеринга. Кадры выделены цветом в зависимости от номера кадра, что упрощает отслеживание конкретного кадра.
В Android Studio все кадры трассировки также отображаются в табличном формате на вкладке «Все кадры» .

Столбцы «Номер кадра» , «Приложение» , «Ожидание GPU» и «Композиция» содержат те же данные, что и дорожки в разделе « Жизненный цикл кадра» , как указано выше. Столбец « Длительность кадра» отображает время от начала приложения до начала отображения кадров на экране . По сути, это время, необходимое для рендеринга кадра от начала до конца.
Вы можете отсортировать таблицу кадров по любому столбцу, чтобы быстро найти самый короткий или самый длинный кадр. Таблица также поддерживает элементы управления пагинацией, которые помогут вам перемещаться по сотням кадров.
Для обнаружения и исследования проблем с производительностью Android 11 выполните следующие действия:
Отсортируйте таблицу «Все кадры» по столбцу «Приложение» в порядке убывания, чтобы кадры, загрузка которых занимает больше всего времени, отображались первыми.

Найдите самые длинные кадры и выберите строку в таблице. Это позволит увеличить масштаб выбранного кадра на временной шкале слева.

Найдите соответствующие темы в разделах «Жизненный цикл фрейма» и «Темы обсуждения» .

Обнаружение зависаний на Android 10 и более ранних версиях.
Для устройств, использующих Android 10 (уровень API 29) и ниже, соответствующая информация о графическом конвейере ОС отображается в одном разделе трассировки системы CPU Profiler, который называется Display .

- Кадры : В этом разделе отображаются события трассировки потока пользовательского интерфейса и
RenderThreadв вашем приложении. События длительностью более 16 мс выделены красным цветом, чтобы подчеркнуть потенциальные проблемы с плавной отрисовкой кадров, поскольку они превышают лимит рендеринга при 60 кадрах в секунду (fps). - SurfaceFlinger : В этом разделе показано, когда SurfaceFlinger обрабатывает буферы кадров. SurfaceFlinger — это системный процесс, отвечающий за отправку буферов на дисплей.
- VSYNC : В этом разделе отображается сигнал VSYNC, который синхронизирует конвейер отображения. На дорожке отображается сигнал VSYNC-app, который показывает, когда ваше приложение запускается слишком поздно. Обычно это происходит из-за занятости потока пользовательского интерфейса. Это вызывает видимое мерцание на экране во время анимации и добавляет дополнительную задержку ввода до завершения анимации или прокрутки. Это особенно важно для дисплеев с высокой частотой обновления, поскольку такие задержки могут возникать чаще, чем 60 раз в секунду, или с переменной частотой.
- BufferQueue : В этом разделе отображается количество буферов кадров, находящихся в очереди и ожидающих обработки SurfaceFlinger. Для приложений, развернутых на устройствах под управлением Android 9 (уровень API 28) или выше, этот параметр показывает количество буферов в очереди BufferQueue приложения (
0,1или2). BufferQueue помогает понять состояние буферов изображений при их перемещении между графическими компонентами Android. Например, значение2означает, что приложение в данный момент использует тройную буферизацию, что приводит к дополнительной задержке ввода.
Раздел «Отображение» предоставляет полезные сигналы для обнаружения потенциальных задержек — например, когда поток пользовательского интерфейса или RenderThread выполняется дольше 16 мс. Чтобы выяснить точные причины задержки, вы можете изучить раздел «Потоки» , в котором отображаются потоки, относящиеся к рендерингу пользовательского интерфейса.

На рисунке выше в разделе «Потоки» показаны поток пользовательского интерфейса ( java.com.google.samples.apps.iosched ), RenderThread и поток GPU completion . Это потоки, относящиеся к рендерингу пользовательского интерфейса и способные вызывать задержки.
Чтобы обнаружить задержки в работе Android 10 или более ранних версий, выполните следующие действия:
Посмотрите на дорожку «Кадры» в разделе «Дисплей» . Красные рамки — это объекты, подлежащие исследованию.

Как только вы обнаружите потенциально проблемный кадр, увеличьте масштаб, нажав клавишу
Wили прокрутив колесико мыши, удерживая клавишу Control ( Command в macOS). Продолжайте увеличивать масштаб, пока не начнете видеть события трассировки в потоке пользовательского интерфейса иRenderThread.
На рисунке выше
Choreographer#doFrameпоказывает, когда поток пользовательского интерфейса вызываетChoreographerдля координации анимации, компоновки представления, отрисовки изображений и связанных процессов.DrawFramesпоказывает, когда формируетсяRenderThreadи выдает фактические команды отрисовки графическому процессору.Если вы видите особенно длинное событие трассировки в основном потоке, увеличьте масштаб, чтобы определить, какой компонент пользовательского интерфейса или составная функция задерживает кадр.
Расширенное исследование с помощью Perfetto
Задача профилирования трассировки системы в Android Studio основана на Perfetto. Если вы сталкиваетесь со сложными проблемами рендеринга и вам требуются пользовательские SQL-запросы или расширенная навигация по временной шкале, вы можете провести анализ трассировки вне IDE.
Экспортируйте трассировку системы из Android Studio, нажав значок «Экспорт трассировки» на панели «Профилировщик», а затем перетащите полученный файл в веб- интерфейс Perfetto . Это обеспечит специализированную среду для анализа производительности на системном уровне. Информацию о том, как интерпретировать детали графического конвейера ОС, такие как VSYNC, SurfaceFlinger и дорожки временной шкалы кадров, см. в официальной документации Perfetto .
Узнать больше
Чтобы узнать больше о том, как уменьшить задержки, см. раздел «Распространенные причины задержек» .