Автоматически создавайте профили для каждого релиза приложения, используя библиотеку Jetpack Macrobenchmark и BaselineProfileRule . Мы рекомендуем использовать com.android.tools.build:gradle:8.0.0 или более позднюю версию, которая обеспечивает улучшения сборки при использовании базовых профилей.
Вот общие шаги для создания нового базового профиля:
- Настройте модуль «Базовый профиль».
- Определите модульный тест (JUnit), который помогает создавать базовые профили.
- Добавьте критически важные пользовательские сценарии (CUJ), которые вы хотите оптимизировать.
- Сгенерируйте базовый профиль.
После создания базового профиля проведите его тестирование с помощью физического устройства, чтобы измерить улучшение скорости.
Создайте новый базовый профиль с помощью AGP 8.2 или выше.
Самый простой способ создать новый базовый профиль — использовать шаблон модуля «Базовый профиль», доступный начиная с Android Studio Iguana и Android Gradle Plugin (AGP) версии 8.2.
Шаблон модуля «Генератор базовых профилей Android Studio» автоматизирует создание нового модуля для генерации и тестирования базовых профилей. Запуск шаблона генерирует большую часть типичной конфигурации сборки, код генерации базовых профилей и код проверки. Шаблон создает код для генерации и тестирования базовых профилей для измерения производительности при запуске приложения.
Настройка модуля «Базовый профиль»
Для запуска шаблона модуля «Базовый профиль» выполните следующие действия:
- Выберите Файл > Создать > Новый модуль
- Выберите шаблон «Генератор базового профиля» на панели «Шаблоны» и настройте его:

Рисунок 1. Шаблон модуля «Генератор базового профиля». В шаблоне содержатся следующие поля:
- Целевое приложение : определяет, для какого приложения будет создан базовый профиль. Если в вашем проекте только один модуль приложения, в этом списке будет только один элемент.
- Название модуля : имя, которое вы хотите присвоить создаваемому модулю «Базовый профиль».
- Имя пакета : имя пакета, которое вы хотите использовать для модуля «Базовый профиль».
- Язык : укажите, хотите ли вы, чтобы сгенерированный код был написан на Kotlin или Java.
- Язык конфигурации сборки : хотите ли вы использовать Kotlin Script (KTS) или Groovy для скриптов конфигурации сборки.
- Используйте управляемые Gradle устройства : если вы используете управляемые Gradle устройства для тестирования вашего приложения.
- Нажмите «Готово» , и новый модуль будет создан. Если вы используете систему контроля версий, вам может быть предложено добавить файлы только что созданного модуля в систему контроля версий.
Определите генератор базового профиля.
Вновь созданный модуль содержит тесты как для генерации и оценки производительности базового профиля, так и для тестирования только базового запуска приложения. Мы рекомендуем дополнить их тестами, включив в них CUJ и расширенные рабочие процессы запуска. Убедитесь, что все тесты, связанные с запуском приложения, находятся в блоке rule с параметром includeInStartupProfile , установленным в значение true ; наоборот, для оптимальной производительности убедитесь, что любые тесты, не связанные с запуском приложения, не включены в профиль запуска. Оптимизация запуска приложения используется для определения специальной части базового профиля, называемой профилем запуска .
Для повышения удобства сопровождения рекомендуется абстрагировать эти CUJ-модули от сгенерированного кода базового профиля и бенчмарк-кода, чтобы их можно было использовать в обоих случаях. Это означает, что изменения в ваших CUJ-модулях будут использоваться согласованно.
Сгенерируйте и установите базовый профиль.
Шаблон модуля «Базовый профиль» добавляет новую конфигурацию запуска для генерации базового профиля. Если вы используете варианты продукта, Android Studio создаст несколько конфигураций запуска, чтобы вы могли генерировать отдельные базовые профили для каждого варианта.

После завершения настройки запуска функции «Создать базовый профиль» сгенерированный базовый профиль копируется в файл src/ variant /generated/baselineProfiles/baseline-prof.txt в модуле, который профилируется. Вариантами выбора являются либо тип сборки «релиз», либо вариант сборки, включающий тип сборки «релиз».
Сгенерированный базовый профиль изначально создаётся в build/outputs . Полный путь определяется вариантом или версией профилируемого приложения, а также тем, используете ли вы устройство, управляемое Gradle, или подключенное устройство для профилирования. Если вы используете имена, используемые в коде и конфигурациях сборки, сгенерированных шаблоном, базовый профиль создаётся в файле build/outputs/managed_device_android_test_additional_output/nonminifiedrelease/pixel6Api31/BaselineProfileGenerator_generate-baseline-prof.txt . Вам, вероятно, не придётся напрямую взаимодействовать с этой версией сгенерированного базового профиля, если только вы не будете вручную копировать его в целевые модули (не рекомендуется).
Создайте новый базовый профиль с помощью AGP 8.1.
Если у вас нет возможности использовать шаблон модуля «Базовый профиль» , воспользуйтесь шаблоном модуля «Макробенчмарк» и плагином Gradle «Базовый профиль» для создания нового базового профиля. Мы рекомендуем использовать эти инструменты, начиная с Android Studio Giraffe и AGP 8.1.
Вот шаги по созданию нового базового профиля с использованием шаблона модуля Macrobenchmark и плагина Gradle для создания базового профиля:
- Настройте модуль Macrobenchmark в вашем проекте Gradle.
- Создайте новый класс с именем
BaselineProfileGenerator:class BaselineProfileGenerator { @get:Rule val baselineProfileRule = BaselineProfileRule() @Test fun startup() = baselineProfileRule.collect( packageName = "com.example.app", profileBlock = { startActivityAndWait() } ) }
Генератор может содержать взаимодействия с вашим приложением, выходящие за рамки его запуска. Это позволяет оптимизировать производительность приложения во время выполнения, например, прокрутку списков, запуск анимаций и навигацию внутри
Activity. См. другие примеры тестов, использующих@BaselineProfileRuleдля улучшения критически важных пользовательских сценариев. Добавьте плагин Gradle для создания базовых профилей (
libs.plugins.androidx.baselineprofile). Этот плагин упрощает генерацию базовых профилей и их последующее сопровождение.Для создания базового профиля запустите в терминале задачи Gradle
:app:generateBaselineProfileили:app:generate Variant BaselineProfile.Запустите генератор в режиме инструментального тестирования на физическом устройстве с правами root, эмуляторе или устройстве, управляемом Gradle . Если вы используете устройство, управляемое Gradle, установите
aospв качествеsystemImageSource, поскольку для генератора базового профиля необходимы права root.По завершении процесса генерации базовый профиль копируется в папку
app/src/ variant /generated/baselineProfiles.
Создайте новый базовый профиль без использования шаблонов.
Мы рекомендуем создавать базовый профиль, используя шаблон модуля «Базовый профиль» Android Studio (предпочтительно) или шаблон Macrobenchmark , но вы также можете использовать плагин Gradle для создания базового профиля отдельно. Подробнее о плагине Gradle для создания базового профиля см. в разделе «Настройка генерации базового профиля» .
Вот как создать базовый профиль, используя непосредственно плагин Baseline Profile Gradle:
- Создайте новый модуль
com.android.test, например,:baseline-profile. Настройте файл
build.gradle.ktsдля:baseline-profile:- Примените плагин
androidx.baselineprofile. - Убедитесь, что
targetProjectPathуказывает на модуль:app. - При желании можно добавить устройство, управляемое Gradle (GMD) . В следующем примере это
pixel6Api31. Если не указано иное, плагин использует подключенное устройство, эмулированное или физическое. - Примените нужные параметры конфигурации, как показано в следующем примере.
Котлин
plugins { id("com.android.test") id("androidx.baselineprofile") } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath = ":app" // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices += "pixel6Api31" // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices = false }
Классный
plugins { id 'com.android.test' id 'androidx.baselineprofile' } android { defaultConfig { ... } // Point to the app module, the module that you're generating the Baseline Profile for. targetProjectPath ':app' // Configure a GMD (optional). testOptions.managedDevices.devices { pixel6Api31(com.android.build.api.dsl.ManagedVirtualDevice) { device 'Pixel 6' apiLevel 31 systemImageSource 'aosp' } } } dependencies { ... } // Baseline Profile Gradle plugin configuration. Everything is optional. This // example uses the GMD added earlier and disables connected devices. baselineProfile { // Specifies the GMDs to run the tests on. The default is none. managedDevices ['pixel6Api31'] // Enables using connected devices to generate profiles. The default is // `true`. When using connected devices, they must be rooted or API 33 and // higher. useConnectedDevices false }
- Примените плагин
Создайте тест базового профиля в модуле тестирования
:baseline-profile. В следующем примере показан тест, который запускает приложение и ожидает перехода в режим ожидания.Котлин
class BaselineProfileGenerator { @get:Rule val baselineRule = BaselineProfileRule() @Test fun startupBaselineProfile() { baselineRule.collect("com.myapp") { startActivityAndWait() } } }
Java
public class BaselineProfileGenerator { @Rule Public BaselineProfileRule baselineRule = new BaselineProfileRule(); @Test Public void startupBaselineProfile() { baselineRule.collect( "com.myapp", (scope -> { scope.startActivityAndWait(); Return Unit.INSTANCE; }) ) } }
Обновите файл
build.gradle.ktsв модуле приложения, например, добавив в:app.`.- Примените плагин
androidx.baselineprofile. - Добавьте зависимость
baselineProfileк модулю:baseline-profile.
Котлин
plugins { id("com.android.application") id("androidx.baselineprofile") } android { // There are no changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile(project(":baseline-profile")) }
Классный
plugins { id 'com.android.application' id 'androidx.baselineprofile' } android { // No changes to the `android` block. ... } dependencies { ... // Add a `baselineProfile` dependency on the `:baseline-profile` module. baselineProfile ':baseline-profile' }
- Примените плагин
Создайте профиль, запустив задачи Gradle `
:app:generateBaselineProfileили:app:generate Variant BaselineProfile.По завершении процесса генерации базовый профиль копируется в папку
app/src/ variant /generated/baselineProfiles.
Создайте новый базовый профиль с помощью AGP 7.3-7.4
Создание базовых профилей возможно с помощью AGP 7.3-7.4, но мы настоятельно рекомендуем обновиться как минимум до AGP 8.1, чтобы использовать плагин Baseline Profile Gradle и его новейшие функции.
Если вам необходимо создать базовые профили с использованием AGP 7.3-7.4, шаги аналогичны шагам для AGP 8.1 , за исключением следующих моментов:
- Не добавляйте плагин Baseline Profile Gradle.
- Для генерации базовых профилей выполните задачу Gradle
./gradlew [emulator name][flavor][build type]AndroidTest. Например,./gradlew :benchmark:pixel6Api31BenchmarkAndroidTest. - Вам необходимо вручную применить сгенерированные правила базового профиля к своему коду .
Примените сгенерированные правила вручную.
Генератор базового профиля создает текстовый файл в удобочитаемом формате (HRF) на устройстве и копирует его на ваш хост-компьютер. Чтобы применить сгенерированный профиль к вашему коду, выполните следующие действия:
Найдите файл HRF в папке сборки модуля, в котором вы создаете профиль:
[module]/build/outputs/managed_device_android_test_additional_output/[device].Профили формируются по шаблону именования
[class name]-[test method name]-baseline-prof.txt, который выглядит следующим образом:BaselineProfileGenerator-startup-baseline-prof.txt.Скопируйте сгенерированный профиль в папку
src/main/и переименуйте файл вbaseline-prof.txt.Добавьте зависимость от библиотеки ProfileInstaller в файл
build.gradle.ktsвашего приложения, чтобы включить локальную компиляцию базового профиля там, где облачные профили недоступны. Это единственный способ установить базовый профиль локально.dependencies { implementation("androidx.profileinstaller:profileinstaller:1.4.1") }Соберите производственную версию вашего приложения, пока применяемые правила HRF компилируются в бинарный формат и включаются в APK или AAB. Затем распространяйте ваше приложение как обычно.
Сравнительный анализ базового профиля.
Для проведения сравнительного анализа базового профиля создайте новую конфигурацию запуска инструментальных тестов Android из боковой панели, которая будет выполнять тесты, определенные в файле StartupBenchmarks.kt или StartupBencharks.java . Более подробную информацию о сравнительном тестировании см. в разделах «Создание класса Macrobenchmark» и «Автоматизация измерений с помощью библиотеки Macrobenchmark» .

При запуске этого кода в Android Studio в выходных данных сборки будут содержаться подробные сведения об улучшении скорости, которое обеспечивает базовый профиль:
StartupBenchmarks_startupCompilationBaselineProfiles timeToInitialDisplayMs min 161.8, median 178.9, max 194.6 StartupBenchmarks_startupCompilationNone timeToInitialDisplayMs min 184.7, median 196.9, max 202.9
Укажите все необходимые пути выполнения кода.
Для измерения времени запуска приложения используются два ключевых показателя:
- Время до первого отображения (TTID)
- Время, необходимое для отображения первого кадра пользовательского интерфейса приложения.
- Время до полного отображения (TTFD)
- TTID плюс время до отображения контента, загружаемого асинхронно после отображения начального кадра.
Значение TTFD сообщается после вызова метода reportFullyDrawn() компонента ComponentActivity . Если reportFullyDrawn() никогда не вызывается, вместо него сообщается TTID. Возможно, потребуется отложить вызов reportFullyDrawn() до завершения асинхронной загрузки. Например, если пользовательский интерфейс содержит динамический список, такой как RecyclerView или ленивый список , список может заполняться фоновой задачей, которая завершается после первой отрисовки списка и, следовательно, после того, как пользовательский интерфейс помечен как полностью отрисованный. В таких случаях код, выполняющийся после того, как пользовательский интерфейс достигнет состояния полной отрисовки, не включается в базовый профиль.
Чтобы включить заполнение списка в ваш базовый профиль, получите объект FullyDrawnReporter с помощью getFullyDrawnReporter() и добавьте к нему репортер в код вашего приложения. Освободите репортер, как только фоновая задача завершит заполнение списка. FullyDrawnReporter не вызывает метод reportFullyDrawn() до тех пор, пока не будут освобождены все репортеры. Таким образом, базовый профиль включает в себя пути выполнения кода, необходимые для заполнения списка. Это не меняет поведение приложения для пользователя, но позволяет базовому профилю включать все необходимые пути выполнения кода.
Если ваше приложение использует Jetpack Compose , используйте следующие API для указания состояния полной отрисовки:
-
ReportDrawnуказывает, что ваш составной объект немедленно готов к взаимодействию. -
ReportDrawnWhenпринимает предикат, напримерlist.count > 0, чтобы указать, когда ваш компонент готов к взаимодействию. - Метод
ReportDrawnAfterпринимает приостанавливающий вызов, который по завершении указывает на готовность вашего составного объекта к взаимодействию.
Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Сбор метрик Macrobenchmark
- Напишите макротест производительности
- Библиотека JankStats