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

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

В Android поддерживаются два уровня трассировки: системная трассировка и трассировка методов.

Поскольку системная трассировка отслеживает только области, специально отмеченные для трассировки, она имеет низкие накладные расходы и не сильно влияет на производительность вашего приложения. Системная трассировка отлично подходит для просмотра того, сколько времени требуется для выполнения определенных разделов вашего кода.

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

По умолчанию системные трассировки не включают отдельные компонуемые функции. Они доступны в трассировках методов.

Трассировка композиции показывает компонуемые функции внутри системных трассировок. Эта функция обеспечивает вам низкую интрузивность от системной трассировки с уровнями детализации трассировки методов в композиции.

Настройка трассировки состава

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

  • Android-студия Flamingo
  • Интерфейс создания: 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

Хотя мы стремились максимально минимизировать накладные расходы на эту функцию, для приложений Compose размер APK увеличивается из-за трассировки строк, встроенных в 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 \
    < {
        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= 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 трассировка с устройства (местоположение указано в команде записи).

  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.

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

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