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

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

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

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

Сделать трассировку системы

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

  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 является тем же самым, который запускают пользователи приложения.

Точное время

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

Зафиксируйте след с помощью 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.

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

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