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