Трассировки часто являются лучшим источником информации при первом рассмотрении проблемы с производительностью. Они позволяют сформулировать гипотезу о сути проблемы и о том, с чего начать поиск.
В Android поддерживается два уровня трассировки: системная трассировка и трассировка методов.
Поскольку системная трассировка отслеживает только области, специально отмеченные для трассировки, она не создаёт больших накладных расходов и не оказывает значительного влияния на производительность вашего приложения. Системная трассировка отлично подходит для отслеживания времени выполнения определённых фрагментов кода.
Трассировка методов отслеживает каждый вызов функции в вашем приложении. Это очень затратно и существенно влияет на производительность приложения, но даёт полную картину происходящего, какие функции вызываются и как часто.
По умолчанию системные трассировки не включают отдельные компонуемые функции. Они доступны в трассировках методов.
Трассировка композиции позволяет увидеть компонуемые функции внутри системных трассировок. Эта функция обеспечивает низкую степень вмешательства, характерную для системной трассировки, с уровнями детализации, характерными для трассировки методов в композиции.
Настройка трассировки композиции
Чтобы опробовать трассировку рекомпозиции в своем проекте, вам необходимо обновиться как минимум до следующих версий:
- Android Studio Фламинго
- Интерфейс создания сообщений: 1.3.0
- Компилятор Compose: 1.3.0
Устройство или эмулятор, на котором вы запускаете трассировку, также должны иметь уровень API не ниже 30.
Кроме того, вам необходимо добавить новую зависимость от Compose Runtime Tracing:
implementation("androidx.compose.runtime:runtime-tracing:1.8.1")
Если вы используете Compose BOM , вам не нужно указывать версию:
val composeBom = platform("androidx.compose:compose-bom:2025.05.00")
implementation(composeBom)
// ...
// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")
Благодаря этой зависимости при проведении трассировки системы, включающей рекомпозицию, вы можете автоматически увидеть компонуемые функции.
Проведите трассировку системы
Чтобы провести трассировку системы и увидеть новую трассировку рекомпозиции в действии, выполните следующие действия:
Откройте профайлер:
Рисунок 2. Android Studio — начало профилирования Нажмите на временную шкалу ЦП
Рисунок 3. Android Studio Profiler — временная шкала ЦП Перейдите в приложение к пользовательскому интерфейсу, который вы хотите отслеживать, а затем выберите «Трассировка и запись системы ».
Рисунок 4. Параметры трассировки – Трассировка системы Используйте приложение для запуска рекомпозиции и остановки записи. После обработки и отображения трассировки вы должны увидеть компонуемые объекты в трассировке рекомпозиции. Для масштабирования и панорамирования трассы можно использовать клавиатуру и мышь. Если вы не знакомы с навигацией по трассировке, см. документацию по записи трассировок .
Рисунок 5. Системная трассировка Двойной щелчок по компонуемому элементу на диаграмме перенаправит вас к его исходному коду.
Вы также можете увидеть составные элементы в Flame Chart вместе с номером файла и строки:
Рисунок 6. Диаграмма пламени
Предостережения
Накладные расходы на размер 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 — это тот же 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 см. в разделе «Аргументы инструментария Macrobenchmark».
Обратная связь
Мы будем рады узнать ваши отзывы об этой функции, любых найденных ошибках и любых пожеланиях. Вы можете отправить нам отзыв, используя систему отслеживания ошибок .