Базовые профили повышают скорость выполнения кода примерно на 30% с момента первого запуска, исключая этапы интерпретации и JIT- компиляции для включенных участков кода.
By shipping a Baseline Profile in an app or library, Android Runtime (ART) can optimize specified code paths through Ahead-of-Time (AOT) compilation, providing performance enhancements for every new user and every app update. This Profile Guided Optimization (PGO) lets apps optimize startup, reduce interaction jank, and improve overall runtime performance for users from the first launch.
Эти улучшения производительности напрямую приводят к улучшению бизнес-показателей, таких как удержание пользователей, количество транзакций и рейтинги. Подробнее о том, как производительность влияет на бизнес-показатели, вы можете прочитать в статьях от Джоша , Lyft , TikTok и Zomato .
Преимущества базовых профилей
Профили базовой конфигурации позволяют предварительно компилировать код в критически важных для пользователя ситуациях, таких как запуск приложения, навигация между экранами или прокрутка контента, что делает их более плавными с первого запуска. Повышая скорость и отзывчивость приложения, профили базовой конфигурации могут привести к увеличению числа ежедневно активных пользователей и повышению среднего показателя повторных посещений.
Baseline Profiles help guide optimization beyond app startup by providing common user interactions that improve app runtime from the first launch. Guided AOT compilation doesn't rely on user devices and can be done once per release on a development machine instead of a mobile device. By shipping releases with a Baseline Profile, app optimizations become available much faster than by relying on Cloud Profiles alone.
При отсутствии базового профиля весь код приложения либо компилируется JIT-компилятором в памяти после интерпретации, либо записывается в файл odex в фоновом режиме, когда устройство находится в режиме ожидания. После установки или обновления приложения пользователи получают неоптимальный опыт с первого запуска до тех пор, пока не будут оптимизированы новые участки кода. Многие приложения демонстрируют повышение производительности примерно на 30% после оптимизации.
Профили стартапов
Startup profiles are similar to Baseline Profiles, but they are used at compile time to optimize DEX layout for faster startup times, rather than for on-device optimization. To learn more about how startup profiles differ from Baseline Profiles, see Compare Baseline Profiles and Startup Profiles . For more on DEX layout optimization, see DEX layout optimizations and startup profiles .
Начать
Чтобы начать оптимизацию производительности существующего приложения, см. раздел «Создание базовых профилей» .
Создание профилей против релизных сборок
Важно понимать разницу в конфигурациях сборки, необходимых при создании файлов базового и стартового профилей (например, baseline-prof.txt и startup-prof.txt ), по сравнению с конфигурацией при сборке финального APK-файла, использующего эти профили.
При создании файлов профилирования (например, benchmark ):
When capturing a Baseline Profile with a test, your app must not be obfuscated. To make sure the generated profile rules accurately match your code's method signatures, you must turn off obfuscation and optimization (R8) for the build variant used for profile generation. This variant must be different from your release build variant, which has obfuscation and optimization enabled. You achieve this by setting isMinifyEnabled = false for the profile generation build variant. If you aren't using the Baseline Profile Gradle plugin, you should also make sure that -dontobfuscate and -dontoptimize are applied. The Baseline Profile Gradle Plugin automatically handles this configuration for you.
Вы можете убедиться, что ваше приложение не было обфусцировано во время генерации профиля, открыв сгенерированный текстовый файл профиля (например, baseline-prof.txt ) и проверив, что имена классов и методов не обфусцированы.
При создании финального APK-файла:
When building your release app, your app should be obfuscated. Your release build must have isMinifyEnabled = true to benefit from obfuscation, minification, and optimization. R8 automatically rewrites the rules from your unobfuscated profile files to match the obfuscated and optimized code in your release APK. The build takes advantage of the unobfuscated text file by transforming the rules correctly.
Для корректной работы оптимизации компоновки DEX (на основе профилей запуска) ваше релизное приложение должно быть обфусцировано и использовать R8 со всеми включенными оптимизациями.
Расширенные (не Gradle) рабочие процессы:
If you use an advanced, non-Gradle workflow (such as Bazel, Buck, or custom CI automation pipelines) to generate your profiles, you must still follow the same principles. Your app must not be obfuscated or optimized when capturing the profile. However, when you build your release app, you must obfuscate it. R8 processes the unobfuscated text rules file and correctly transforms the rules to apply to the obfuscated release app.
Минимально рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и тестовые версии релизов. Для создания и установки базового профиля используйте следующие поддерживаемые версии или выше плагина Android Gradle, библиотеки Macrobenchmark и установщика профилей. Эти зависимости требуются в разное время и работают вместе как цепочка инструментов для обеспечения оптимального базового профиля.
- Плагин Android Gradle:
com.android.tools.build:8.0.0 - Библиотека Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.4.1 - Установщик профилей:
androidx.profileinstaller:profileinstaller:1.4.1
Мы рекомендуем использовать последнюю версию AGP для создания и управления базовыми профилями. Вот основные функции, доступные в разных версиях AGP:
| версия AGP | Функции |
|---|---|
| 9.1 | Полная поддержка каталогов исходного кода (модули библиотек): помимо каталогов, учитывающих варианты, вы можете объявить несколько исходных файлов базового профиля с произвольным именем, например, src/free/generated/baselineProfiles/baseline-prof1.txt , как для модулей библиотек, так и для модулей приложений. |
| 8.4 | При локальной установке приложений, не подлежащих отладке, с помощью инструмента командной строки Gradle wrapper или Android Studio устанавливаются базовые профили, благодаря чему производительность вашей локальной релизной сборки будет более точно соответствовать производительности производственной среды. Это обновление не влияет на производительность базовых профилей в производственной среде. |
| 8.3 |
|
| 8.2 |
|
| 8.0 | Рекомендуемая минимальная версия: используйте плагин Gradle Baseline Profile для создания базовых профилей с помощью одной задачи Gradle.
|
| 7.4 | Минимальная поддерживаемая версия: приложения могут использовать базовые профили из библиотек и предоставлять свой собственный базовый профиль в файле src/main/baseline-prof.txt .
|
Настройки источника профиля с учетом вариантов
Используя плагин Android Gradle Plugin (AGP) версии 8.0 для приложений и AGP версии 8.3 для библиотек, вы можете размещать правила базового профиля в специально выделенном каталоге для набора исходных файлов, выходя за рамки ограничений одного фиксированного пути (например, src/main/baseline-prof.txt ) и включая несколько файлов.
Это обеспечивает надежную поддержку вариантов, позволяя определять отдельные базовые профили, адаптированные к конкретным вариантам и типам сборки (например, с использованием каталогов типа src/variant/baselineProfiles/ ), что гарантирует точное применение правил оптимизации производительности для каждого уникального исполняемого файла приложения или библиотеки.
Пример генерации профиля
Ниже приведён пример класса для создания базового профиля при запуске приложения, а также нескольких событий навигации и прокрутки с использованием рекомендуемой библиотеки Macrobenchmark :
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
uiAutomator {
// App startup journey.
startApp(PACKAGE_NAME)
// Find and click elements using the new DSL
onElement { textAsString() == "COMPOSE LAZYLIST" }.click()
onElement { viewIdResourceName == "myLazyColumn" }.also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
pressBack()
}
}
}
}
Для получения дополнительной информации об использовании библиотеки UI Automator для автоматизации пользовательских сценариев см. раздел «Написание автоматизированных тестов с помощью UI Automator» .
Полный текст этого кода, а также более подробная информация о его производительности доступны в наших примерах на GitHub .
Что включить
При использовании базовых профилей в приложении вы можете включить код запуска приложения и типичные взаимодействия пользователя, такие как навигация между экранами или прокрутка. Вы также можете собрать целые сценарии, такие как регистрация, вход в систему или оплата. Любые пользовательские сценарии, которые вы считаете критически важными, могут выиграть от использования базовых профилей, улучшив свою производительность во время выполнения.
Если вы экспериментируете с различными подходами к повышению производительности, рассмотрите возможность включения базовых профилей для обеих групп эксперимента. Это позволит упростить интерпретацию результатов, обеспечив единообразное использование скомпилированного кода всеми пользователями.
Библиотеки могут предоставлять собственные базовые профили и включать их в релизы для повышения производительности приложений. Например, см. раздел «Использование базового профиля» в руководстве по производительности Jetpack Compose .
Как работают базовые профили
При разработке приложения или библиотеки рекомендуется определять базовые профили, охватывающие типичные взаимодействия пользователя, где время отрисовки или задержка имеют важное значение. Вот как они работают:
Для вашего приложения генерируются удобочитаемые правила профилирования, которые компилируются в двоичный формат внутри приложения. Вы можете найти их в
assets/dexopt/baseline.prof. Затем вы можете загрузить Android App Bundle (AAB) в Google Play как обычно.Google Play обрабатывает профиль и отправляет его пользователям напрямую вместе с APK-файлом. Во время установки ART выполняет AOT-компиляцию методов из профиля, что приводит к ускорению их выполнения. Если профиль содержит методы, используемые при запуске приложения или во время отрисовки кадров, пользователь может заметить более быстрый запуск и уменьшение рывков.
Этот процесс взаимодействует с функцией агрегации облачных профилей для точной настройки производительности на основе фактического использования приложения с течением времени.

Сравните базовые профили и профили стартапов.
Для определения и создания файлов профилирования используется плагин Baseline Profile Gradle. Этот плагин интегрируется в процесс сборки, и AGP компилирует эти удобочитаемые правила профилирования в бинарный формат — упакованный как baseline.prof внутри APK или AAB — который ART может эффективно использовать для компиляции на устройстве, при условии, что его размер не превышает 1,5 МБ.
Эти файлы профилирования обычно называются startup-prof.txt и baseline-prof.txt . Хотя их содержимое иногда может казаться похожим, особенно если вы в основном ориентируетесь на запуск системы, они выполняют разные функции и влияют на производительность на разных этапах:
Базовый профиль
Файл базового профиля содержит полный набор правил, которые среда выполнения Android (ART) использует для предварительной компиляции часто используемых участков кода, что оптимизирует производительность приложения не только при запуске.
Файл базового профиля, как правило, представляет собой расширенный набор правил, содержащихся в вашем профиле запуска. Этот файл включает в себя все правила, необходимые для оптимизации запуска приложения (генерируемые с помощью задачи Gradle baselineProfile ), а также дополнительные профили для других важных пользовательских сценариев. Например, прокрутка и навигация по различным экранам.
Эти дополнительные правила, не связанные с запуском системы, генерируются независимо от значения поля конфигурации includeInStartupProfile .
Профиль стартапа
The Startup Profile file contains rules specifically optimized for your app's startup path. During compilation, D8 converts the Java bytecode into DEX format. R8 then uses this file to influence the layout of your DEX files, making sure that critical startup code is placed in the primary DEX file for faster execution. You should generally set includeInStartupProfile to true only for test scenarios essential to the app's initial display. For more information, see Create Startup Profiles .
Облачные профили
Облачные профили предлагают дополнительную форму PGO — агрегированную Google Play Store и распространяемую для компиляции во время установки — наряду с базовыми профилями.
While Cloud Profiles are driven by real-world user interactions with the app, they take several hours to days after an update to be distributed, limiting their availability. Until profiles are fully distributed, app performance is suboptimal for users of new or updated apps. Further, Cloud Profiles only support Android devices running Android 9 (API level 28) or higher, and only scale well for apps that have a sufficiently large user base.
Поведение компиляции в разных версиях Android
В разных версиях платформы Android используются различные подходы к компиляции приложений, каждый из которых имеет свой компромисс в отношении производительности. Базовые профили улучшают предыдущие методы компиляции, предоставляя профиль для всех установленных приложений.
| версия для Android | Метод компиляции | Оптимизационный подход |
|---|---|---|
| 5 до 6 (уровни API от 21 до 23) | Полный AOT | Вся программа оптимизируется во время установки, что приводит к длительному ожиданию начала работы с приложением, увеличению использования оперативной и дисковой памяти, а также к увеличению времени загрузки кода с диска, потенциально повышая время холодного запуска. |
| 7 до 8.1 (уровни API от 24 до 27) | Частичный AOT (базовый профиль) | Базовые профили устанавливаются с помощью androidx.profileinstaller при первом запуске, когда модуль приложения определяет эту зависимость. ART может дополнительно улучшить этот процесс, добавив дополнительные правила профилирования во время использования приложения и скомпилировав их, когда устройство находится в режиме ожидания. Это оптимизирует использование дискового пространства и время загрузки кода с диска, тем самым сокращая время ожидания приложения. |
| 9 (уровень API 28) и выше | Частичный AOT (базовый уровень + профиль облака) | Play использует базовые профили во время установки приложений для оптимизации APK-файла и облачных профилей (если таковые имеются). После установки профили ART загружаются в Play, объединяются, а затем предоставляются другим пользователям в качестве облачных профилей при установке или обновлении приложения. |
Известные проблемы
Ниже перечислены возможные проблемы и решения, а также проблемы, для которых в настоящее время разрабатываются обходные пути:
Создание базового профиля может завершиться неудачей из-за настроек разрешений на некоторых устройствах, включая устройства OnePlus. Чтобы обойти эту проблему, отключите параметр « Отключить мониторинг разрешений» в настройках параметров разработчика .
Для успешного создания базовых профилей для библиотек используйте плагин Baseline Profile Gradle версии 1.2.3 или AGP 8.3, как минимум ( проблема #313992099 ).
If you generate Baseline Profiles with the command
./gradlew app:generateBaselineProfile, the benchmarks in the test module also run, and the results are discarded. If this happens, you can generate only the Baseline Profiles by running the command with-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. This issue has been fixed in AGP 8.2.Команда для генерации базовых профилей для всех типов сборки
./gradlew app:generateBaselineProfile— генерирует базовые профили только для типа сборки «релиз». Эта проблема исправлена в AGP 8.1.Каналы распространения приложений, отличные от Google Play Store, могут не поддерживать использование базовых профилей при установке. Пользователи приложений, установленных через эти каналы, не увидят преимуществ до тех пор, пока не запустится фоновая обработка dexopt — что, скорее всего, произойдет ночью.
Внутренняя функция обмена приложениями в Play Store не поддерживает базовые профили; однако внутренняя тестовая среда поддерживает.
Оптимизация энергопотребления на некоторых устройствах, например, на устройствах Huawei, может мешать установке профилей. Чтобы обеспечить эффективную установку профилей, отключите все оптимизации энергопотребления на ваших тестовых устройствах.
Дополнительные ресурсы
- Оптимизация компоновки DEX и профили запуска
- Повысьте производительность приложения с помощью базовых профилей.
Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создание базовых профилей {:#creating-profile-rules}
- Создавайте и измеряйте базовые профили без использования Macrobenchmark.
- Оптимизация компоновки DEX и профили запуска