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

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

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

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

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

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

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

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

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

  • Android Studio Flamingo
  • Compose UI: 1.3.0
  • Компилятор Compose: 1.3.0

Устройство или эмулятор, на котором вы запускаете трассировку, также должен иметь как минимум уровень API 30.

Кроме того, необходимо добавить новую зависимость от Compose Runtime Tracing:

implementation("androidx.compose.runtime:runtime-tracing:1.10.4")

Если вы используете Compose BOM , указывать версию не нужно:

val composeBom = platform("androidx.compose:compose-bom:2026.02.01")
implementation(composeBom)
// ...

// dependency without a version
implementation("androidx.compose.runtime:runtime-tracing")

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

Выполните трассировку системы.

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

  1. Откройте профилировщик:

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

    Профайлер Android Studio — временная шкала загрузки ЦП
    Рисунок 3. Профайлер Android Studio — временная шкала ЦП.
  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-файл будет тем же самым, который используют пользователи приложения.

Точное время

Для точного профилирования, как и при любом тестировании производительности, необходимо сделать приложение 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».

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

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