Базовые профили повышают скорость выполнения кода примерно на 30% с момента первого запуска, исключая этапы интерпретации и JIT- компиляции для включенных участков кода.
Благодаря включению базового профиля в приложение или библиотеку, среда выполнения Android (ART) может оптимизировать указанные участки кода посредством компиляции с предварительным анализом (AOT), обеспечивая повышение производительности для каждого нового пользователя и каждого обновления приложения. Эта оптимизация на основе профиля (PGO) позволяет приложениям оптимизировать запуск, уменьшить задержки при взаимодействии и улучшить общую производительность во время выполнения для пользователей с первого запуска.
Эти улучшения производительности напрямую приводят к улучшению бизнес-показателей, таких как удержание пользователей, количество транзакций и рейтинги. Подробнее о том, как производительность влияет на бизнес-показатели, вы можете прочитать в статьях от Джоша , Lyft , TikTok и Zomato .
Преимущества базовых профилей
Базовые профили обеспечивают более плавное взаимодействие с пользователем с самого первого запуска, включая запуск приложения, навигацию между экранами и прокрутку контента. Повышая скорость и отзывчивость приложения, базовые профили могут привести к увеличению числа ежедневно активных пользователей и повышению среднего показателя повторных посещений.
Базовые профили помогают оптимизировать приложение не только при запуске, но и в дальнейшем, предоставляя информацию о типичных взаимодействиях пользователя, что улучшает время выполнения приложения с первого запуска. Управляемая AOT-компиляция не зависит от пользовательских устройств и может быть выполнена один раз для каждого релиза на машине разработчика, а не на мобильном устройстве. Благодаря включению базового профиля в релизы, оптимизация приложения становится доступной гораздо быстрее, чем при использовании только облачных профилей .
При отсутствии базового профиля весь код приложения либо компилируется JIT-компилятором в памяти после интерпретации, либо записывается в файл odex в фоновом режиме, когда устройство находится в режиме ожидания. После установки или обновления приложения пользователи получают неоптимальный опыт с первого запуска до тех пор, пока не будут оптимизированы новые участки кода. Многие приложения демонстрируют повышение производительности примерно на 30% после оптимизации.
Профили стартапов
Профили запуска похожи на базовые профили, но разница в том, что они используются во время компиляции, а не для оптимизации на устройстве. Профиль запуска используется для оптимизации структуры DEX-файла с целью сокращения времени запуска. Код, указанный в профиле запуска, помещается в основной файл classes.dex , а остальной код — в отдельные DEX-файлы. Это сокращает время запуска за счет уменьшения количества ошибок страничного доступа во время запуска приложения. Чтобы узнать больше о том, как профили запуска и оптимизация структуры DEX-файлов могут сократить время запуска приложения, см. раздел «Оптимизация структуры DEX-файлов» и «Профили запуска» .
Начать
Чтобы начать оптимизацию производительности существующего приложения, см. раздел «Создание базовых профилей» .
Создание профилей против релизных сборок
Важно понимать разницу в конфигурациях сборки, необходимых при создании файлов базового и стартового профилей (например, baseline-prof.txt и startup-prof.txt ), по сравнению с конфигурацией при сборке финального APK-файла, использующего эти профили.
При создании файлов профилирования (например, benchmark ):
Чтобы гарантировать точное соответствие сгенерированных правил профилирования сигнатурам методов вашего кода, необходимо отключить обфускацию и оптимизацию (R8) для варианта сборки, используемого для генерации профилирования. Этот вариант должен отличаться от варианта сборки для релиза, в котором обфускация и оптимизация включены. Это достигается установкой параметра isMinifyEnabled = false для варианта сборки, используемого для генерации профилирования. Если вы не используете плагин Baseline Profile Gradle, убедитесь также, что применены параметры -dontobfuscate и -dontoptimize . Плагин Baseline Profile Gradle автоматически выполняет эту настройку.
При создании финального APK-файла:
В вашей релизной сборке всегда должно быть установлено isMinifyEnabled = true , чтобы воспользоваться преимуществами обфускации, минификации и оптимизации. R8 автоматически переписывает правила из ваших необфусцированных файлов профиля, чтобы они соответствовали обфусцированному и оптимизированному коду в вашем релизном APK. Для эффективной оптимизации структуры DEX (управляемой профилями запуска) ваше релизное приложение должно быть обфусцировано и использовать R8 со всеми включенными оптимизациями.
Минимально рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и тестовые версии релизов. Для создания и установки базового профиля используйте следующие поддерживаемые версии или выше плагина 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 | Функции |
|---|---|
| 8.4 | При локальной установке приложений, не подлежащих отладке, с помощью инструмента командной строки Gradle wrapper или Android Studio устанавливаются базовые профили, благодаря чему производительность вашей локальной релизной сборки будет более точно соответствовать производительности производственной среды. Это обновление не влияет на производительность базовых профилей в производственной среде. |
| 8.3 |
|
| 8.2 |
|
| 8.0 | Рекомендуемая минимальная версия: используйте плагин Gradle Baseline Profile для создания базовых профилей с помощью одной задачи Gradle.
|
| 7.4 | Минимальная поддерживаемая версия: приложения могут использовать базовые профили из библиотек и предоставлять свой собственный базовый профиль в файле src/main/baseline-prof.txt .
|
Пример генерации профиля
Ниже приведён пример класса для создания базового профиля при запуске приложения, а также нескольких событий навигации и прокрутки с использованием рекомендуемой библиотеки 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. После этого вы можете загрузить AAB в Google Play как обычно.Google Play обрабатывает профиль и отправляет его пользователям напрямую вместе с APK-файлом. Во время установки ART выполняет AOT-компиляцию методов из профиля, что приводит к ускорению их выполнения. Если профиль содержит методы, используемые при запуске приложения или во время отрисовки кадров, пользователь может заметить более быстрый запуск и уменьшение рывков.
Этот процесс взаимодействует с функцией агрегации облачных профилей для точной настройки производительности на основе фактического использования приложения с течением времени.

Облачные профили
Облачные профили предлагают дополнительную форму PGO — агрегированную Google Play Store и распространяемую для компиляции во время установки — наряду с базовыми профилями.
Хотя облачные профили создаются на основе реального взаимодействия пользователей с приложением, их распространение занимает от нескольких часов до нескольких дней после обновления, что ограничивает их доступность. До тех пор, пока профили не будут полностью распространены, производительность приложения будет неоптимальной для пользователей новых или обновленных приложений. Кроме того, облачные профили поддерживают только устройства Android под управлением Android 9 (уровень API 28) или выше и хорошо масштабируются только для приложений с достаточно большой пользовательской базой.
Поведение компиляции в разных версиях 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. Чтобы обойти эту проблему, отключите параметр « Отключить мониторинг разрешений» в настройках параметров разработчика .
Создание базового профиля не поддерживается на устройствах Firebase Test Lab, включая устройства Test Lab, управляемые Gradle ( проблема #285187547 ).
Для успешного создания базовых профилей для библиотек используйте плагин Baseline Profile Gradle версии 1.2.3 или AGP 8.3, как минимум ( проблема #313992099 ).
Если вы создадите базовые профили с помощью команды
./gradlew app:generateBaselineProfile, то тесты производительности в тестовом модуле также будут запущены, а результаты будут отброшены. В этом случае вы можете создать только базовые профили, запустив команду с параметром-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Эта проблема исправлена в AGP 8.2.Команда для генерации базовых профилей для всех типов сборки
./gradlew app:generateBaselineProfile— генерирует базовые профили только для типа сборки «релиз». Эта проблема исправлена в AGP 8.1.Каналы распространения приложений, отличные от Google Play Store, могут не поддерживать использование базовых профилей при установке. Пользователи приложений, установленных через эти каналы, не увидят преимуществ до тех пор, пока не запустится фоновая обработка dexopt — что, скорее всего, произойдет ночью.
Внутренняя функция обмена приложениями в Play Store не поддерживает базовые профили; однако внутренняя тестовая среда поддерживает.
Оптимизация энергопотребления на некоторых устройствах, например, на устройствах Huawei, может мешать установке профилей. Чтобы обеспечить эффективную установку профилей, отключите все оптимизации энергопотребления на ваших тестовых устройствах.
Дополнительные ресурсы
{% verbatim %}Рекомендуем вам
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создание базовых профилей {:#creating-profile-rules}
- Создавайте и измеряйте базовые профили без использования Macrobenchmark.
- Оптимизация компоновки DEX и профили запуска