Профили базовой конфигурации повышают скорость выполнения кода примерно на 30% с первого запуска, поскольку позволяют избежать интерпретации и JIT-компиляции для включенных путей выполнения.
Если в приложении или библиотеке есть профиль базовой конфигурации, Android Runtime (ART) может оптимизировать указанные пути выполнения с помощью предварительной компиляции. Это повышает производительность для каждого нового пользователя и при каждом обновлении приложения. Оптимизация на основе профиля (PGO) позволяет ускорить запуск приложения, уменьшить задержки при взаимодействии и повысить общую производительность во время работы, начиная с первого запуска.
Улучшение производительности напрямую влияет на бизнес-показатели, такие как удержание пользователей, количество транзакций и оценки. Подробнее о том, как производительность влияет на бизнес-показатели, читайте в историях успеха Josh, Lyft, TikTok и Zomato.
Преимущества профилей базовой конфигурации
Базовые профили позволяют предварительно компилировать код для критически важных взаимодействий с пользователем, таких как запуск приложения, навигация между экранами или прокрутка контента, что делает их более плавными с первого запуска. Повышая скорость и отзывчивость приложения, профили базовой конфигурации могут привести к увеличению числа активных пользователей за день и более высокому среднему коэффициенту повторных посещений.
Профили базовой конфигурации помогают оптимизировать не только запуск приложения, но и распространенные действия пользователей, что повышает производительность приложения с первого запуска. Для управляемой AOT-компиляции не нужны устройства пользователей. Ее можно выполнять один раз для каждого выпуска на компьютере для разработки, а не на мобильном устройстве. Если вы будете выпускать релизы с профилем Baseline, оптимизация приложения станет доступна гораздо быстрее, чем при использовании только облачных профилей.
Если профиль Baseline Profile не используется, весь код приложения либо компилируется JIT-компилятором в памяти после интерпретации, либо записывается в файл odex в фоновом режиме, когда устройство не используется. После установки или обновления приложения пользователи сталкиваются с неоптимальной производительностью при первом запуске, пока новые пути выполнения не будут оптимизированы.
После оптимизации производительность многих приложений увеличивается примерно на 30 %.
Профили запуска
Профили запуска похожи на базовые профили, но используются во время компиляции для оптимизации макета DEX, чтобы ускорить запуск, а не для оптимизации на устройстве. Подробнее о том, чем профили запуска отличаются от профилей базовой конфигурации… Подробнее об оптимизации макета DEX и профилях запуска…
Начать
Чтобы начать оптимизацию производительности в существующем приложении, ознакомьтесь с разделом Создание профилей базовой конфигурации.
Создание профиля и конечные сборки
Важно понимать разницу в конфигурациях сборки, необходимых при создании файлов Baseline и профиля запуска (например, baseline-prof.txt и startup-prof.txt), и при сборке финального APK-файла, в котором используются эти профили.
При создании файлов профиля (например, benchmark):
При создании профиля базовых показателей с помощью теста приложение не должно быть обфусцировано.
Чтобы сгенерированные правила профиля точно соответствовали сигнатурам методов вашего кода, необходимо отключить обфускацию и оптимизацию (R8) для варианта сборки, используемого для генерации профиля. Этот вариант должен отличаться от варианта конечной сборки, в котором включены обфускация и оптимизация. Для этого задайте значение isMinifyEnabled = false для варианта сборки, генерирующего профиль. Если вы не используете плагин Baseline Profile Gradle, убедитесь, что применяются -dontobfuscate и -dontoptimize. Плагин Baseline Profile Gradle автоматически обрабатывает эту конфигурацию за вас.
Чтобы убедиться, что код приложения не был обфусцирован во время создания профиля, откройте сгенерированный текстовый файл профиля (например, baseline-prof.txt) и проверьте, что названия классов и методов не обфусцированы.
При создании финальной версии APK-файла:
При создании рабочей версии приложения его код должен быть обфусцирован. Чтобы воспользоваться преимуществами обфускации, минификации и оптимизации, в конечной сборке должно быть включено свойство isMinifyEnabled = true. R8 автоматически переписывает правила из необфусцированных файлов профиля, чтобы они соответствовали обфусцированному и оптимизированному коду в APK-файле выпуска. Сборка использует преимущества незашифрованного текстового файла, правильно преобразуя правила.
Чтобы работала оптимизация макета DEX (на основе профилей запуска), код рабочей версии приложения должен быть обфусцирован, а в R8 должны быть включены все оптимизации.
Расширенные рабочие процессы (без Gradle)
Если вы используете расширенный рабочий процесс, не связанный с Gradle (например, Bazel, Buck или пользовательские конвейеры автоматизации непрерывной интеграции), для создания профилей, вы все равно должны следовать тем же принципам. Приложение не должно быть обфусцировано или оптимизировано во время записи профиля. Однако при создании рабочей версии приложения обфускация обязательна. R8 обрабатывает файл правил для необфусцированного текста и преобразует правила так, чтобы они применялись к обфусцированному приложению.
Минимальные рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и разрабатываемые версии. Чтобы создать и установить базовый профиль, используйте указанные ниже или более поздние версии плагина Android Gradle, библиотеки Macrobenchmark и Profile Installer. Эти зависимости требуются в разное время и работают вместе как набор инструментов, позволяющий создать оптимальный профиль Baseline.
- Плагин Android Gradle:
com.android.tools.build:8.0.0 - Библиотека Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.5.0 - Установщик профиля:
androidx.profileinstaller:profileinstaller:1.4.1
Для создания базовых профилей и управления ими рекомендуем использовать последнюю версию AGP. Ниже перечислены основные функции, доступные в разных версиях AGP.
| Версия AGP | Функции |
|---|---|
| 9.1 |
Полная поддержка каталогов наборов исходных файлов (модули библиотек). Помимо каталогов, учитывающих варианты, вы можете объявить несколько исходных файлов профиля Baseline с произвольным названием, например src/free/generated/baselineProfiles/baseline-prof1.txt, как для модулей библиотек, так и для модулей приложений.
|
| 8.4 | При локальной установке приложений из сборок, не предназначенных для отладки, с помощью инструмента командной строки Gradle Wrapper или Android Studio устанавливаются профили Baseline. Это позволяет приблизить производительность локальной конечной сборки к рабочей. Это обновление не влияет на производительность профилей базовой конфигурации в рабочей версии. |
| 8.3 |
|
| 8.2 |
|
| 8.0 | Минимальная рекомендуемая версия. Используйте плагин Baseline Profile Gradle, чтобы генерировать профили базовой конфигурации с помощью одной задачи Gradle.
|
| 7.4 |
Минимальная поддерживаемая версия. Приложения могут использовать базовые профили из библиотек и предоставлять собственный базовый профиль в файле src/main/baseline-prof.txt.
|
Настройки источника профиля с учетом вариантов
Если вы используете плагин Android Gradle (AGP) версии 8.0 для приложений и AGP версии 8.3 для библиотек, то можете разместить правила профиля Baseline в специальном каталоге набора исходных файлов, а не в одном фиксированном пути (например, 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…
Полный код и подробную информацию можно найти в примерах на GitHub.
Требования к содержанию видео
При использовании профилей Baseline в приложении вы можете включить код запуска приложения и распространенные взаимодействия с пользователем, такие как навигация между экранами или прокрутка. Вы также можете собирать целые потоки, такие как регистрация, вход в систему или оплата. Профили базовой конфигурации могут улучшить производительность во время выполнения для любых путей пользователя, которые вы считаете критически важными.
Если вы экспериментируете с разными подходами к повышению производительности, рекомендуем включить профили базовой конфигурации для обеих групп эксперимента. Это упростит интерпретацию результатов, поскольку все пользователи будут работать с компилированным кодом.
Библиотеки могут предоставлять собственные профили Baseline и поставлять их вместе с выпусками для повышения производительности приложений. Например, ознакомьтесь с разделом Использование профиля базовой конфигурации в статье о производительности Jetpack Compose.
Как работают профили базовой конфигурации
При разработке приложения или библиотеки рекомендуется определить профили Baseline Profile, чтобы охватить распространенные взаимодействия с пользователем, для которых важны время отрисовки или задержка. Вот как это работает:
Для вашего приложения создаются человекочитаемые правила профиля, которые компилируются в двоичную форму. Их можно найти в каталоге
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 Runtime (ART) использует для предварительной компиляции часто используемых путей выполнения кода. Это позволяет оптимизировать производительность приложения не только при запуске.
Файл профиля базовой конфигурации обычно представляет собой надмножество правил, содержащихся в профиле запуска. Этот файл содержит все правила, необходимые для оптимизации запуска приложения (созданные с помощью задачи Gradle baselineProfile), а также дополнительные профили для других критически важных путей пользователя. Например, прокрутка
и навигация по разным экранам.
Эти дополнительные правила, не связанные с запуском, создаются независимо от значения поля конфигурации includeInStartupProfile.
Профиль стартапа
Файл профиля запуска содержит правила, специально оптимизированные для пути запуска вашего приложения. Во время компиляции D8 преобразует байт-код Java в формат DEX.
Затем R8 использует этот файл, чтобы повлиять на макет ваших DEX-файлов, гарантируя, что критически важный код запуска помещается в основной DEX-файл для более быстрого выполнения. Как правило, значение true для параметра includeInStartupProfile следует задавать только в тестовых сценариях, необходимых для первоначального показа приложения. Подробнее о том, как создать профиль запуска…
Профили Cloud
Облачные профили – это дополнительная форма оптимизации на основе профиля, которая агрегируется Google Play и распространяется для компиляции во время установки вместе с базовыми профилями.
Хотя облачные профили основаны на реальных взаимодействиях пользователей с приложением, их распространение после обновления занимает от нескольких часов до нескольких дней, что ограничивает их доступность. Пока профили не будут полностью распределены, производительность приложения будет неоптимальной для пользователей новых или обновленных приложений. Кроме того, облачные профили поддерживают только устройства 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-компиляция (базовый профиль + облачный профиль) | Google Play использует базовые профили при установке приложений, чтобы оптимизировать APK и облачные профили, если они доступны. После установки профили ART загружаются в Google Play, агрегируются и предоставляются в виде облачных профилей другим пользователям, когда они устанавливают или обновляют приложение. |
Известные проблемы
Ниже перечислены возможные проблемы и способы их решения, а также проблемы, для которых в настоящее время разрабатываются обходные пути.
На некоторых устройствах, например OnePlus, создание базового профиля может завершиться ошибкой из-за настроек разрешений. Чтобы обойти эту проблему, отключите параметр Отключить мониторинг разрешений в разделе Для разработчиков.
Чтобы успешно предоставлять профили Baseline для библиотек, используйте плагин Baseline Profile Gradle версии 1.2.3 или AGP версии 8.3 или более поздней (проблема № 313992099).
Если вы создаете профили Baseline с помощью команды
./gradlew app:generateBaselineProfile, тесты производительности в тестовом модуле также выполняются, а результаты отбрасываются. В этом случае вы можете сгенерировать только базовые профили, выполнив команду с-P android.testInstrumentationRunnerArguments.androidx.benchmark.enabledRules=BaselineProfile. Эта проблема устранена в AGP 8.2.Команда для создания профилей базовой конфигурации для всех типов сборки (
./gradlew app:generateBaselineProfile) создает профили только для конечной сборки. Эта проблема устранена в AGP 8.1.Каналы распространения приложений, отличные от Google Play, могут не поддерживать использование базовых профилей при установке. Пользователи приложений, установленных через эти каналы, не увидят преимуществ, пока не будет выполнена фоновая оптимизация dexopt, которая обычно происходит ночью.
Внутренний доступ к приложениям в Google Play не поддерживает базовые профили, но они поддерживаются в канале внутреннего тестирования.
На некоторых устройствах, например Huawei, установке профиля может мешать режим экономии заряда батареи. Чтобы профили устанавливались эффективно, отключите оптимизацию батареи на устройствах для тестирования.
Дополнительные ресурсы
- Оптимизация макета DEX и профили запуска
- Как улучшить производительность приложения с помощью профилей базовой конфигурации
Рекомендуем
- Примечание. Текст ссылки показывается, когда JavaScript отключен.
- Как создать профиль базовой конфигурации {:#creating-profile-rules}
- Как создавать и оценивать базовые профили без Macrobenchmark
- Оптимизация макета DEX и профили запуска