Трассировка – это лучший источник информации для начала работы над проблемой производительности. Они позволяют сформировать гипотезу о том, в чём заключается проблема и с чего начать поиск.
В Android поддерживается два уровня трассировки: трассировка системы и трассировка метода.
Поскольку трассировка системы отслеживает только области, специально помеченные для трассировки, она имеет низкие накладные расходы и не сильно влияет на производительность вашего приложения. Трассировка системы позволяет узнать, сколько времени занимает выполнение определенных разделов кода.
Трассировка методов отслеживает каждый вызов функции в приложении. Это очень ресурсоемкий процесс, который сильно влияет на производительность приложения, но дает полное представление о том, что происходит, какие функции вызываются и как часто.
По умолчанию трассировки системы не включают отдельные composable-функции. Они доступны в трассировках методов.
Трассировка композиции показывает composable-функции в трассировках системы. Эта функция обеспечивает низкую навязчивость трассировки системы с уровнями детализации трассировки методов в композиции.
Настройка трассировки композиции
Чтобы попробовать отслеживание рекомпозиции в своем проекте, вам необходимо обновить его как минимум до следующих версий:
- Android Studio Flamingo
- Compose UI: 1.3.0
- Compose Compiler: 1.3.0
Устройство или эмулятор, на котором вы запускаете трассировку, также должны иметь уровень API не ниже 30.
Кроме того, вам необходимо добавить новую зависимость от Compose Runtime Tracing:
implementation("androidx.compose.runtime:runtime-tracing:1.12.1")
Если вы используете Compose BOM, указывать версию не нужно:
val composeBom = platform("androidx.compose:compose-bom:2026.09.00")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
При наличии этой зависимости, когда вы выполняете трассировку системы, включающую рекомпозицию, вы можете автоматически видеть composable-функции.
Как выполнить трассировку системы
Чтобы выполнить трассировку системы и увидеть новую трассировку рекомпозиции в действии, выполните следующие действия:
Откройте профилировщик.
Рисунок 2. Android Studio – запуск профилирования Нажмите Хронология ЦП.
Рисунок 3. Android Studio Profiler – временная шкала ЦП Откройте в приложении интерфейс, который хотите отследить, и выберите Трассировка системы > Запись.
Рисунок 4. Trace options - System trace (Параметры трассировки - Трассировка системы) Используйте приложение, чтобы вызвать рекомпозицию и остановить запись. После обработки и появления трассировки вы сможете увидеть composable-функции в трассировке рекомпозиции. Для масштабирования и панорамирования трассировки можно использовать клавиатуру и мышь. Если вы не знаете, как перемещаться по трассировке, ознакомьтесь с документацией по записи трассировок.
Рисунок 5. Трассировка системы Дважды нажмите на composable-функцию на диаграмме, чтобы перейти к ее исходному коду.
Вы также можете увидеть composable-функции на флейм-графе вместе с файлом и номером строки:
Рисунок 6. Флейм-граф
Важные примечания
При использовании трассировки композиции учитывайте следующие особенности, касающиеся размера и производительности APK.
Дополнительный размер APK-файла
Хотя мы стремились максимально минимизировать накладные расходы на эту функцию, размер APK-файла для приложений Compose увеличивается за счет строк трассировки, встроенных в APK компилятором Compose. Если вы используете Compose не очень активно, размер увеличится незначительно. Если же приложение полностью написано на Compose, размер может увеличиться существенно. Эти строки трассировки дополнительно деобфусцируются, чтобы их можно было увидеть в инструментах трассировки, как показано выше. Компилятор Compose внедряет их во все приложения, начиная с версии 1.3.0.
Строки трассировки можно удалить из рабочей сборки, добавив следующее правило Proguard:
-assumenosideeffects public class androidx.compose.runtime.ComposerKt {
boolean isTraceInProgress();
void traceEventStart(int,int,int,java.lang.String);
void traceEventStart(int,java.lang.String);
void traceEventEnd();
}
В будущем эти функции могут измениться, но все изменения будут упомянуты в примечаниях к выпуску Compose.
Обратите внимание, что сохранение функций, хотя и приводит к увеличению размера APK, гарантирует, что профилируемый APK будет таким же, как и тот, который запускают пользователи приложения.
Точное время
Чтобы профилирование было точным, как и при любом тестировании производительности, вам нужно сделать приложение profileable и non-debuggable, как описано в разделе Профилируемые приложения.
Как получить трассировку из терминала
Вы можете получить трассировку композиции из терминала. Для этого вам нужно выполнить действия, которые Android Studio обычно делает автоматически.
Добавьте зависимости
Сначала добавьте в приложение дополнительные зависимости.
implementation("androidx.tracing:tracing-perfetto:1.0.0")
implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
Команда для создания записи
- Сгенерируйте команду записи с помощью Perfetto.
Вручную добавьте раздел источника данных
track_event, как показано в примере ниже.adb shell perfetto \ -c - --txt \ -o /data/misc/perfetto-traces/trace \ <<EOF buffers: { size_kb: 63488 fill_policy: RING_BUFFER } buffers: { size_kb: 2048 fill_policy: RING_BUFFER } data_sources: { config { name: "track_event" } } duration_ms: 10000 flush_period_ms: 30000 incremental_state_config { clear_period_ms: 5000 } EOF
Как записать трассировку
- Запустите приложение и откройте раздел, который хотите отследить.
Включите трассировку в приложении, отправив широковещательное сообщение.
# set app package variable, e.g. com.google.samples.apps.nowinandroid.debug # can be found through `adb shell ps -ef` or `adb shell cmd package list packages` package=<your app process> # issue a broadcast to enable tracing adb shell am broadcast \ -a androidx.tracing.perfetto.action.ENABLE_TRACING \ $package/androidx.tracing.perfetto.TracingReceiverЗапустите команду записи, которую вы создали ранее.
Как открыть трассировку
adb pull <location>трассировку с устройства (местоположение указано в команде записи).Откройте файл в Perfetto.
Как записать трассировку с помощью Jetpack Macrobenchmark
Для измерения производительности можно использовать Jetpack Macrobenchmark. Результаты будут представлены в виде трассировок. Чтобы включить трассировку композиции с помощью макротестов, выполните следующие действия:
Добавьте в тестовый модуль Macrobenchmark следующие дополнительные зависимости:
implementation("androidx.tracing:tracing-perfetto:1.0.0") implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")Добавьте аргумент инструментирования
androidx.benchmark.fullTracing.enable=trueперед запуском тестов. Подробнее об аргументах инструментирования Macrobenchmark…
Отзыв
Мы будем рады услышать ваши отзывы об этой функции, а также узнать о найденных ошибках и пожеланиях. Вы можете отправить нам отзыв, используя систему отслеживания ошибок.