Плагин Baseline Profile Gradle упрощает создание и поддержку Baseline Profiles . Он помогает вам выполнять следующие задачи:
- Создайте новые базовые профили для вашего приложения .
- Создайте новые базовые профили для вашей библиотеки .
- Настройте генерацию базового профиля.
На этой странице объясняется, как использовать плагин Baseline Profile Gradle для настройки генерации базовых профилей.
Требования к плагину
- AGP 8.0 или выше
- Зависимость от последней версии плагина Gradle
Используйте Gradle Managed Devices для создания базовых профилей
Чтобы использовать Gradle Managed Device (GMD) для создания базового профиля, добавьте его в конфигурацию build.gradle.kts
модуля производителя профилей (вероятно, это тестовый модуль :baselineprofile
), как показано в следующем примере:
Котлин
android { testOptions.managedDevices.devices { create<com.android.build.api.dsl.ManagedVirtualDevice>("pixel6Api31") { device = "Pixel 6" apiLevel = 31 systemImageSource = "aosp" } } }
Круто
android { testOptions.managedDevices.devices { pixel6Api31(ManagedVirtualDevice) { device 'Pixel 6' apiLevel = 31 systemImageSource 'aosp' } } }
Используйте GMD для генерации базовых профилей, добавив его в конфигурацию плагина Gradle Baseline Profile следующим образом в build.gradle.kts
тестового модуля :baselineprofile
:
Котлин
baselineProfile { managedDevices += "pixel6Api31" }
Круто
baselineProfile { managedDevices = ['pixel6Api31'] }
При использовании GMD для генерации базовых профилей установите useConnectedDevices
в false
в тестовом модуле :baselineprofile
:
Котлин
baselineProfile { ... useConnectedDevices = false }
Круто
baselineProfile { ... useConnectedDevices false }
Генерация базовых профилей для различных вариантов
Вы можете генерировать базовые профили для каждого варианта, для каждого вкуса или как один файл для использования для всех вариантов. Управляйте этим поведением с помощью настройки слияния, как показано в следующем примере, в build.gradle.kts
модуля приложения или библиотеки.
Котлин
baselineProfile { mergeIntoMain = true }
Круто
baselineProfile { mergeIntoMain true }
Чтобы объединить сгенерированные профили для всех вариантов в один профиль, установите mergeIntoMain
в true
. Невозможно сгенерировать базовые профили для каждого варианта, если этот параметр установлен в значение true
, поэтому есть одна задача Gradle, которая называется generateBaselineProfile
. Профиль выводится в src/main/generated/baselineProfiles
.
Чтобы отключить слияние и иметь один профиль на вариант, установите mergeIntoMain
на false
. В этом случае существует несколько задач Gradle, специфичных для вариантов. Например, когда есть два варианта — например, бесплатный и платный — и один тип сборки релиза, задачи будут следующими:
* `generateFreeReleaseBaselineProfile`
* `generatePaidReleaseBaselineProfile`
* `generateReleaseBaselineProfile`
Чтобы указать поведение слияния для каждого варианта, используйте следующий код:
Котлин
baselineProfile { variants { freeRelease { mergeIntoMain = true } } }
Круто
baselineProfile { variants { freeRelease { mergeIntoMain true } } }
В предыдущем примере все варианты, где флаг установлен на true
объединяются в src/main/generated/baselineProfiles
, тогда как профили для вариантов, где флаг установлен на false
хранятся в папке src/<variant>/generated/baselineProfiles
.
По умолчанию mergeIntoMain
имеет значение true
для библиотек и false
для приложений.
Автоматически генерировать базовые профили при сборке нового релиза
Вы можете настроить Baseline Profiles для автоматического создания с каждой сборкой релиза вместо ручного использования задачи generateBaselineProfile
. При автоматическом создании в сборку релиза включается самый обновленный профиль.
Чтобы включить автоматическую генерацию для релизных сборок, используйте флаг automaticGenerationDuringBuild
:
Котлин
baselineProfile { automaticGenerationDuringBuild = true }
Круто
baselineProfile { automaticGenerationDuringBuild true }
Установка флага automaticGenerationDuringBuild
в значение true
запускает генерацию нового Baseline Profile для каждой сборки выпуска. Это означает, что запуск задачи сборки сборки выпуска, такой как ./gradlew:app:assembleRelease
, также запускает :app:generateReleaseBaselineProfile
, запускает тесты инструментирования Baseline Profile и создает сборку Baseline Profile, на которой они работают. Хотя автоматическая генерация помогает пользователям получить максимальную производительность, она также увеличивает время сборки из-за двойной сборки и тестов инструментирования.
Вы также можете указать это поведение для каждого варианта, как показано в следующем примере:
Котлин
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild = true } } }
Круто
baselineProfile { variants { freeRelease { automaticGenerationDuringBuild true } } }
В предыдущем примере задача generateFreeReleaseBaselineProfile
запускается при запуске assembleFreeRelease
. Это помогает, когда пользователь хочет иметь, например, release
для сборки распространения, который всегда генерирует профиль при сборке, и сборку releaseWithoutProfile
для внутреннего тестирования.
Вместо добавления нового варианта без базового профиля вы также можете отключить генерацию из командной строки следующим образом:
./gradlew assembleRelease -Pandroid.baselineProfile.automaticGenerationDuringBuild=false
Сохранение базовых профилей в источниках
Вы можете сохранить базовые профили в исходном каталоге с помощью флага saveInSrc
в build.gradle.kts
приложения или модуля библиотеки:
-
true
: базовый профиль хранится вsrc/<variant>/generated/baselineProfiles
. Это позволяет вам зафиксировать последний сгенерированный профиль с вашими источниками. -
false
: базовый профиль хранится в промежуточных файлах в каталоге сборки. Таким образом, при фиксации кода вы не сохраняете последний сгенерированный профиль.
Котлин
baselineProfile { saveInSrc = true }
Круто
baselineProfile { saveInSrc true }
Вы также можете указать это поведение для каждого варианта:
Котлин
baselineProfile { variants { freeRelease { saveInSrc = true } } }
Круто
baselineProfile { variants { freeRelease { saveInSrc true } } }
Отключить предупреждения
По умолчанию плагин Baseline Profile Gradle предупреждает вас о ситуациях, которые могут вызвать проблемы. Чтобы отключить предупреждения, вы можете установить соответствующий параметр на false
в файле build.gradle.kts
. Вот параметры предупреждений:
baselineProfile {
warnings {
/**
* Warn when the Android Gradle Plugin version is higher than the max
* tested one.
*/
maxAgpVersion = true
/**
* Warn when a benchmark or baseline profile variant has been disabled.
*/
disabledVariants = true
/**
* Warn that running `generateBaselineProfile` with AGP 8.0 doesn't
* support running instrumentation tests for multiple build types at
* once.
*/
multipleBuildTypesWithAgp80 = true
/**
* Warn when no baseline profiles are generated after running the
* generate baseline profile command.
*/
noBaselineProfileRulesGenerated = true
/**
* Warn when no startup profiles are generated after running the generate
* baseline profile command.
*/
noStartupProfileRulesGenerated = true
}
}
Правила профиля фильтра
Плагин Baseline Profile Gradle позволяет фильтровать сгенерированные правила Baseline Profile. Это особенно полезно для библиотек, если вы хотите исключить правила профиля для классов и методов, которые являются частью других зависимостей примера приложения или самой библиотеки. Фильтры могут включать и исключать определенные пакеты и классы. Если вы указываете только исключения, исключаются только соответствующие правила Baseline Profile, а все остальное включается.
Спецификация фильтров может быть любой из следующих:
- Имя пакета заканчивается двойными подстановочными знаками для соответствия указанному пакету и всем подпакетам. Например,
com.example.**
соответствуетcom.example.method
иcom.example.method.bar
. - Имя пакета, заканчивающееся подстановочным знаком, соответствует только указанному пакету. Например,
com.example.*
соответствуетcom.example.method
, но не соответствуетcom.example.method.bar
. - Имена классов, соответствующие определенному классу, например,
com.example.MyClass
.
В следующих примерах показано, как включать и исключать определенные пакеты:
Котлин
baselineProfile { filter { include("com.somelibrary.widget.grid.**") exclude("com.somelibrary.widget.grid.debug.**") include("com.somelibrary.widget.list.**") exclude("com.somelibrary.widget.list.debug.**") include("com.somelibrary.widget.text.**") exclude("com.somelibrary.widget.text.debug.**") } }
Круто
baselineProfile { filter { include 'com.somelibrary.widget.grid.**' exclude 'com.somelibrary.widget.grid.debug.**' include 'com.somelibrary.widget.list.**' exclude 'com.somelibrary.widget.list.debug.**' include 'com.somelibrary.widget.text.**' exclude 'com.somelibrary.widget.text.debug.**' } }
Настройте правила фильтрации для различных вариантов следующим образом:
Котлин
// Non-specific filters applied to all the variants. baselineProfile { filter { include("com.myapp.**") } } // Flavor-specific filters. baselineProfile { variants { free { filter { include("com.myapp.free.**") } } paid { filter { include("com.myapp.paid.**") } } } } // Build-type-specific filters. baselineProfile { variants { release { filter { include("com.myapp.**") } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include("com.myapp.**") } } } }
Круто
// Non-specific filters applied to all the variants. baselineProfile { filter { include 'com.myapp.**' } } // Flavor-specific filters. baselineProfile { variants { free { filter { include 'com.myapp.free.**' } } paid { filter { include 'com.myapp.paid.**' } } } } // Build-type specific filters. baselineProfile { variants { release { filter { include 'com.myapp.**' } } } } // Variant-specific filters. baselineProfile { variants { freeRelease { filter { include 'com.myapp.**' } } } }
Вы также можете фильтровать правила с помощью аргумента filterPredicate
в BaselineProfileRule.collect()
, но мы рекомендуем использовать плагин Gradle для фильтрации, поскольку он обеспечивает более простой способ фильтрации подпакетов и единое место для настройки всего модуля.
Настройте типы построения эталонного теста и базового профиля
Плагин Baseline Profile Gradle создает дополнительные типы сборки для генерации профилей и запуска бенчмарков. Эти типы сборки имеют префикс benchmark
и nonMinified
. Например, для типа сборки release
плагин создает типы сборки benchmarkRelease
и nonMinifiedRelease
. Эти типы сборки автоматически настраиваются для конкретного варианта использования и, как правило, не требуют настройки. Но есть некоторые случаи, в которых все равно может быть полезно применить некоторые пользовательские параметры, например, применить другую конфигурацию подписи.
Вы можете настроить автоматически сгенерированные типы сборки, используя подмножество свойств типа сборки; свойства, которые не могут быть использованы, переопределяются. Следующий пример показывает, как настроить дополнительные типы сборки и какие свойства переопределяются:
Котлин
android { buildTypes { release { ... } create("benchmarkRelease") { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default // it's the same as for the `release` build type). signingConfig = signingConfigs.getByName("benchmarkRelease") } create("nonMinifiedRelease") { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.getByName("nonMinifiedRelease") // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't // customize the following properties, which are always overridden to // avoid breaking Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
Круто
android { buildTypes { release { ... } benchmarkRelease { // Customize properties for the `benchmarkRelease` build type here. // For example, you can change the signing config (by default it's the // same as for the `release` build type.) signingConfig = signingConfigs.benchmarkRelease } nonMinifiedRelease { // Customize properties for the `nonMinifiedRelease` build type here. signingConfig = signingConfigs.nonMinifiedRelease // From Baseline Profile Gradle plugin 1.2.4 and higher, you can't use // the following properties, which are always overridden to avoid breaking // Baseline Profile generation: // // isJniDebuggable = false // isDebuggable = false // isMinifyEnabled = false // isShrinkResources = false // isProfileable = true // enableAndroidTestCoverage = false // enableUnitTestCoverage = false } } }
Дополнительные примечания
При создании базовых профилей следует учитывать несколько дополнительных моментов:
Скомпилированные базовые профили должны быть меньше 1,5 МБ. Это не относится к текстовому формату в исходных файлах, которые обычно намного больше до компиляции. Проверьте размер вашего бинарного базового профиля, найдя его в выходном артефакте в
assets/dexopt/baseline.prof
для APK илиBUNDLE-METADATA/com.android.tools.build.profiles/baseline.prof
для AAB.Широкие правила, которые компилируют слишком много приложения, могут замедлить запуск из-за возросшего доступа к диску. Если вы только начинаете с базовыми профилями, не беспокойтесь об этом. Однако, в зависимости от вашего приложения, а также размера и количества поездок, добавление большого количества поездок может привести к неоптимальной производительности. Проверьте производительность вашего приложения, попробовав разные профили и убедившись, что производительность не ухудшается после добавлений.