Отслеживание композиции

Трассировки часто являются лучшим источником информации при первом рассмотрении проблемы с производительностью. Они позволяют сформулировать гипотезу о сути проблемы и о том, с чего начать поиск.

В 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")

Благодаря этой зависимости при проведении трассировки системы, включающей рекомпозицию, вы можете автоматически увидеть компонуемые функции.

Проведите трассировку системы

Чтобы провести трассировку системы и увидеть новую трассировку рекомпозиции в действии, выполните следующие действия:

  1. Откройте профайлер:

    Android Studio — Начало профилирования
    Рисунок 2. Android Studio — начало профилирования
  2. Нажмите на временную шкалу ЦП

    Android Studio Profiler — временная шкала ЦП
    Рисунок 3. Android Studio Profiler — временная шкала ЦП
  3. Перейдите в приложение к пользовательскому интерфейсу, который вы хотите отслеживать, а затем выберите «Трассировка и запись системы ».

    Параметры трассировки — Трассировка системы
    Рисунок 4. Параметры трассировки – Трассировка системы
  4. Используйте приложение для запуска рекомпозиции и остановки записи. После обработки и отображения трассировки вы должны увидеть компонуемые объекты в трассировке рекомпозиции. Для масштабирования и панорамирования трассы можно использовать клавиатуру и мышь. Если вы не знакомы с навигацией по трассировке, см. документацию по записи трассировок .

    Системная трассировка
    Рисунок 5. Системная трассировка

    Двойной щелчок по компонуемому элементу на диаграмме перенаправит вас к его исходному коду.

  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")

Сгенерировать команду записи

  1. Сгенерируйте команду записи с помощью Perfetto .
  2. Вручную добавьте раздел источника данных 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

Захватить след

  1. Запустите приложение и подготовьте раздел, который вы хотите трассировать.
  2. Включите отслеживание в приложении, отправив широковещательное сообщение.

    # 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
    
  3. Запустите команду записи, которую вы создали ранее.

Откройте трассировку

  1. adb pull <location> трассировка с устройства (местоположение, указанное в команде записи).

  2. Открыто в Perfetto .

Захватите трассировку с помощью Jetpack Macrobenchmark

Вы можете измерить производительность с помощью Jetpack Macrobenchmark , который предоставляет результаты в виде трассировок. Чтобы включить трассировку композиции с помощью макробенчмарков, необходимо:

  1. Добавьте эти дополнительные зависимости в тестовый модуль Macrobenchmark :

    implementation("androidx.tracing:tracing-perfetto:1.0.0")
    implementation("androidx.tracing:tracing-perfetto-binary:1.0.0")
    
  2. Добавьте аргумент инструментария androidx.benchmark.fullTracing.enable=true перед запуском бенчмарков. Подробнее об аргументах инструментария Macrobenchmark см. в разделе «Аргументы инструментария Macrobenchmark».

Обратная связь

Мы будем рады узнать ваши отзывы об этой функции, любых найденных ошибках и любых пожеланиях. Вы можете отправить нам отзыв, используя систему отслеживания ошибок .