Базовые профили повышают скорость выполнения кода примерно на 30% с первого запуска за счет исключения этапов интерпретации и оперативной (JIT) компиляции для включенных путей кода.
Отправляя базовый профиль в приложение или библиотеку, Android Runtime (ART) может оптимизировать указанные пути кода посредством компиляции Ahead-of-Time (AOT), обеспечивая повышение производительности для каждого нового пользователя и каждого обновления приложения. Эта Profile Guided Optimization (PGO) позволяет приложениям оптимизировать запуск, уменьшать зависание взаимодействия и повышать общую производительность времени выполнения для пользователей с первого запуска.
Эти улучшения производительности напрямую приводят к улучшению бизнес-показателей, таких как удержание пользователей, транзакции и рейтинги. Вы можете прочитать больше о том, как производительность влияет на бизнес-показатели в историях от Джоша , Lyft , TikTok и Zomato .
Преимущества базовых профилей
Baseline Profiles делают все взаимодействия пользователя, такие как запуск приложения, навигация между экранами или прокрутка контента, более плавными с первого запуска. Увеличивая скорость и отзывчивость приложения, Baseline Profiles может привести к увеличению ежедневной активности пользователей и повышению среднего показателя повторных посещений.
Базовые профили помогают направлять оптимизацию за пределы запуска приложения, предоставляя общие пользовательские взаимодействия, которые улучшают время выполнения приложения с первого запуска. Управляемая компиляция AOT не зависит от пользовательских устройств и может выполняться один раз за выпуск на машине разработки вместо мобильного устройства. При отправке выпусков с базовым профилем оптимизации приложений становятся доступными гораздо быстрее, чем при использовании только облачных профилей .
Если базовый профиль не используется, весь код приложения либо компилируется JIT в памяти после интерпретации, либо записывается в odex
файл в фоновом режиме, когда устройство находится в режиме ожидания. После установки или обновления приложения пользователи сталкиваются с неоптимальным опытом с первого запуска до тех пор, пока не будут оптимизированы новые пути кода. Многие приложения измеряют повышение производительности примерно на 30% после оптимизации.
Профили запуска
Профили запуска похожи на базовые профили, но разница в том, что они используются во время компиляции, а не для оптимизации на устройстве. Профиль запуска используется для оптимизации макета файла DEX с целью улучшения времени запуска. Код, указанный в профиле запуска, помещается в основной файл classes.dex
, а другой код помещается в отдельные файлы DEX. Это улучшает время запуска за счет сокращения количества ошибок страниц во время запуска приложения. Чтобы узнать больше о том, как профили запуска и оптимизации макета DEX могут улучшить время запуска приложения, см. Оптимизации макета DEX и профили запуска .
Начать
Чтобы начать оптимизировать производительность существующего приложения, см. раздел Создание базовых профилей .
Минимально рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и разрабатываемые версии релизов. Чтобы сгенерировать и установить базовый профиль, используйте следующие поддерживаемые версии или выше плагина Android Gradle, библиотеки Macrobenchmark и установщика профилей. Эти зависимости требуются в разное время и работают вместе как цепочка инструментов для включения оптимального базового профиля.
- Плагин Android Gradle:
com.android.tools.build:8.0.0
- Библиотека макробенчмарка:
androidx.benchmark:benchmark-macro-junit4:1.3.4
- Установщик профиля:
androidx.profileinstaller:profileinstaller:1.4.1
Мы рекомендуем использовать последнюю версию AGP для создания и управления базовыми профилями. Вот основные функции, которые поставляются с различными версиями AGP:
AGP-версия | Функции |
---|---|
8.4 | Локальные установки приложений неотлаживаемых сборок с помощью инструмента командной строки Gradle wrapper или Android Studio устанавливают базовые профили, поэтому производительность вашей локальной сборки релиза больше соответствует производству. Это обновление не влияет на производительность производства базовых профилей. |
8.3 |
|
8.2 |
|
8.0 | Минимальная рекомендуемая версия: используйте плагин Baseline Profile Gradle для генерации базовых профилей с помощью одной задачи Gradle.
|
7.4 | Минимальная поддерживаемая версия: приложения могут использовать базовые профили из библиотек и предоставлять собственные базовые профили в файле src/main/baseline-prof.txt .
|
Пример генерации профиля
Ниже приведен пример класса для создания базового профиля для запуска приложения, а также нескольких событий навигации и прокрутки с использованием рекомендуемой библиотеки Macrobenchmark :
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
Вы можете увидеть этот код в полном контексте и с более подробной информацией в наших примерах производительности на 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) | Полный АОТ | Все приложение оптимизируется во время установки, что приводит к увеличению времени ожидания перед запуском приложения, увеличению использования оперативной памяти и дискового пространства, а также увеличению времени загрузки кода с диска, что потенциально увеличивает время холодного запуска. |
7–8,1 (уровень API 24–27) | Частичный АОТ (базовый профиль) | Базовые профили устанавливаются androidx.profileinstaller при первом запуске, когда модуль приложения определяет эту зависимость. ART может улучшить это еще больше, добавив дополнительные правила профиля во время использования приложения и скомпилировав их, когда устройство не используется. Это оптимизирует дисковое пространство и время загрузки кода с диска, тем самым сокращая время ожидания для приложения. |
9 (уровень API 28) и выше | Частичный AOT (базовый уровень + профиль облаков) | Play использует базовые профили во время установки приложений для оптимизации профилей APK и Cloud, если они доступны. После установки профили 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, могут мешать установке профиля. Чтобы гарантировать эффективную установку профилей, отключите любые оптимизации батареи на ваших бенчмарк-устройствах.
Дополнительные ресурсы
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создать базовые профили {:#creating-profile-rules}
- Создавайте и измеряйте базовые профили без Macrobenchmark
- Оптимизация макета DEX и профили запуска
Базовые профили повышают скорость выполнения кода примерно на 30% с первого запуска за счет исключения этапов интерпретации и оперативной (JIT) компиляции для включенных путей кода.
Отправляя базовый профиль в приложение или библиотеку, Android Runtime (ART) может оптимизировать указанные пути кода посредством компиляции Ahead-of-Time (AOT), обеспечивая повышение производительности для каждого нового пользователя и каждого обновления приложения. Эта Profile Guided Optimization (PGO) позволяет приложениям оптимизировать запуск, уменьшать зависание взаимодействия и повышать общую производительность времени выполнения для пользователей с первого запуска.
Эти улучшения производительности напрямую приводят к улучшению бизнес-показателей, таких как удержание пользователей, транзакции и рейтинги. Вы можете прочитать больше о том, как производительность влияет на бизнес-показатели в историях от Джоша , Lyft , TikTok и Zomato .
Преимущества базовых профилей
Baseline Profiles делают все взаимодействия пользователя, такие как запуск приложения, навигация между экранами или прокрутка контента, более плавными с первого запуска. Увеличивая скорость и отзывчивость приложения, Baseline Profiles может привести к увеличению ежедневной активности пользователей и повышению среднего показателя повторных посещений.
Базовые профили помогают направлять оптимизацию за пределы запуска приложения, предоставляя общие пользовательские взаимодействия, которые улучшают время выполнения приложения с первого запуска. Управляемая компиляция AOT не зависит от пользовательских устройств и может выполняться один раз за выпуск на машине разработки вместо мобильного устройства. При отправке выпусков с базовым профилем оптимизации приложений становятся доступными гораздо быстрее, чем при использовании только облачных профилей .
Если базовый профиль не используется, весь код приложения либо компилируется JIT в памяти после интерпретации, либо записывается в odex
файл в фоновом режиме, когда устройство находится в режиме ожидания. После установки или обновления приложения пользователи сталкиваются с неоптимальным опытом с первого запуска до тех пор, пока не будут оптимизированы новые пути кода. Многие приложения измеряют повышение производительности примерно на 30% после оптимизации.
Профили запуска
Профили запуска похожи на базовые профили, но разница в том, что они используются во время компиляции, а не для оптимизации на устройстве. Профиль запуска используется для оптимизации макета файла DEX с целью улучшения времени запуска. Код, указанный в профиле запуска, помещается в основной файл classes.dex
, а другой код помещается в отдельные файлы DEX. Это улучшает время запуска за счет сокращения количества ошибок страниц во время запуска приложения. Чтобы узнать больше о том, как профили запуска и оптимизации макета DEX могут улучшить время запуска приложения, см. Оптимизации макета DEX и профили запуска .
Начать
Чтобы начать оптимизировать производительность существующего приложения, см. раздел Создание базовых профилей .
Минимально рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и разрабатываемые версии релизов. Чтобы сгенерировать и установить базовый профиль, используйте следующие поддерживаемые версии или выше плагина Android Gradle, библиотеки Macrobenchmark и установщика профилей. Эти зависимости требуются в разное время и работают вместе как цепочка инструментов для включения оптимального базового профиля.
- Плагин Android Gradle:
com.android.tools.build:8.0.0
- Библиотека макробенчмарка:
androidx.benchmark:benchmark-macro-junit4:1.3.4
- Установщик профиля:
androidx.profileinstaller:profileinstaller:1.4.1
Мы рекомендуем использовать последнюю версию AGP для создания и управления базовыми профилями. Вот основные функции, которые поставляются с различными версиями AGP:
AGP-версия | Функции |
---|---|
8.4 | Локальные установки приложений неотлаживаемых сборок с помощью инструмента командной строки Gradle wrapper или Android Studio устанавливают базовые профили, поэтому производительность вашей локальной сборки релиза больше соответствует производству. Это обновление не влияет на производительность производства базовых профилей. |
8.3 |
|
8.2 |
|
8.0 | Минимальная рекомендуемая версия: используйте плагин Baseline Profile Gradle для генерации базовых профилей с помощью одной задачи Gradle.
|
7.4 | Минимальная поддерживаемая версия: приложения могут использовать базовые профили из библиотек и предоставлять собственные базовые профили в файле src/main/baseline-prof.txt .
|
Пример генерации профиля
Ниже приведен пример класса для создания базового профиля для запуска приложения, а также нескольких событий навигации и прокрутки с использованием рекомендуемой библиотеки Macrobenchmark :
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
Вы можете увидеть этот код в полном контексте и с более подробной информацией в наших примерах производительности на 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) | Полный АОТ | Все приложение оптимизируется во время установки, что приводит к увеличению времени ожидания перед запуском приложения, увеличению использования оперативной памяти и дискового пространства, а также увеличению времени загрузки кода с диска, что потенциально увеличивает время холодного запуска. |
7–8,1 (уровень API 24–27) | Частичный АОТ (базовый профиль) | Базовые профили устанавливаются androidx.profileinstaller при первом запуске, когда модуль приложения определяет эту зависимость. ART может улучшить это еще больше, добавив дополнительные правила профиля во время использования приложения и скомпилировав их, когда устройство не используется. Это оптимизирует дисковое пространство и время загрузки кода с диска, тем самым сокращая время ожидания для приложения. |
9 (уровень API 28) и выше | Частичный AOT (базовый уровень + профиль облаков) | Play использует базовые профили во время установки приложений для оптимизации профилей APK и Cloud, если они доступны. После установки профили 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, могут мешать установке профиля. Чтобы гарантировать эффективную установку профилей, отключите любые оптимизации батареи на ваших бенчмарк-устройствах.
Дополнительные ресурсы
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создать базовые профили {:#creating-profile-rules}
- Создавайте и измеряйте базовые профили без Macrobenchmark
- Оптимизация макета DEX и профили запуска
Базовые профили повышают скорость выполнения кода примерно на 30% с первого запуска за счет исключения этапов интерпретации и оперативной (JIT) компиляции для включенных путей кода.
Отправляя базовый профиль в приложение или библиотеку, Android Runtime (ART) может оптимизировать указанные пути кода посредством компиляции Ahead-of-Time (AOT), обеспечивая повышение производительности для каждого нового пользователя и каждого обновления приложения. Эта Profile Guided Optimization (PGO) позволяет приложениям оптимизировать запуск, уменьшать зависание взаимодействия и повышать общую производительность времени выполнения для пользователей с первого запуска.
Эти улучшения производительности напрямую приводят к улучшению бизнес-показателей, таких как удержание пользователей, транзакции и рейтинги. Вы можете прочитать больше о том, как производительность влияет на бизнес-показатели в историях от Джоша , Lyft , TikTok и Zomato .
Преимущества базовых профилей
Baseline Profiles делают все взаимодействия пользователя, такие как запуск приложения, навигация между экранами или прокрутка контента, более плавными с первого запуска. Увеличивая скорость и отзывчивость приложения, Baseline Profiles может привести к увеличению ежедневной активности пользователей и повышению среднего показателя повторных посещений.
Базовые профили помогают направлять оптимизацию за пределы запуска приложения, предоставляя общие пользовательские взаимодействия, которые улучшают время выполнения приложения с первого запуска. Управляемая компиляция AOT не зависит от пользовательских устройств и может выполняться один раз за выпуск на машине разработки вместо мобильного устройства. При отправке выпусков с базовым профилем оптимизации приложений становятся доступными гораздо быстрее, чем при использовании только облачных профилей .
Если базовый профиль не используется, весь код приложения либо компилируется JIT в памяти после интерпретации, либо записывается в odex
файл в фоновом режиме, когда устройство находится в режиме ожидания. После установки или обновления приложения пользователи сталкиваются с неоптимальным опытом с первого запуска до тех пор, пока не будут оптимизированы новые пути кода. Многие приложения измеряют повышение производительности примерно на 30% после оптимизации.
Профили запуска
Профили запуска похожи на базовые профили, но разница в том, что они используются во время компиляции, а не для оптимизации на устройстве. Профиль запуска используется для оптимизации макета файла DEX с целью улучшения времени запуска. Код, указанный в профиле запуска, помещается в основной файл classes.dex
, а другой код помещается в отдельные файлы DEX. Это улучшает время запуска за счет сокращения количества ошибок страниц во время запуска приложения. Чтобы узнать больше о том, как профили запуска и оптимизации макета DEX могут улучшить время запуска приложения, см. Оптимизации макета DEX и профили запуска .
Начать
Чтобы начать оптимизировать производительность существующего приложения, см. раздел Создание базовых профилей .
Минимально рекомендуемые стабильные версии
Цепочка зависимостей предоставляет стабильные и разрабатываемые версии релизов. Чтобы сгенерировать и установить базовый профиль, используйте следующие поддерживаемые версии или выше плагина Android Gradle, библиотеки Macrobenchmark и установщика профилей. Эти зависимости требуются в разное время и работают вместе как цепочка инструментов для включения оптимального базового профиля.
- Плагин Android Gradle:
com.android.tools.build:8.0.0
- Библиотека макробенчмарка:
androidx.benchmark:benchmark-macro-junit4:1.3.4
- Установщик профиля:
androidx.profileinstaller:profileinstaller:1.4.1
Мы рекомендуем использовать последнюю версию AGP для создания и управления базовыми профилями. Вот основные функции, которые поставляются с различными версиями AGP:
AGP-версия | Функции |
---|---|
8.4 | Локальные установки приложений неотлаживаемых сборок с помощью инструмента командной строки Gradle wrapper или Android Studio устанавливают базовые профили, поэтому производительность вашей локальной сборки релиза больше соответствует производству. Это обновление не влияет на производительность производства базовых профилей. |
8.3 |
|
8.2 |
|
8.0 | Минимальная рекомендуемая версия: используйте плагин Baseline Profile Gradle для генерации базовых профилей с помощью одной задачи Gradle.
|
7.4 | Минимальная поддерживаемая версия: приложения могут использовать базовые профили из библиотек и предоставлять собственные базовые профили в файле src/main/baseline-prof.txt .
|
Пример генерации профиля
Ниже приведен пример класса для создания базового профиля для запуска приложения, а также нескольких событий навигации и прокрутки с использованием рекомендуемой библиотеки Macrobenchmark :
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
Вы можете увидеть этот код в полном контексте и с более подробной информацией в наших примерах производительности на 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 на первом забеге, когда модуль приложения определяет эту зависимость. Искусство может улучшить это дальше, добавив дополнительные правила профиля во время использования приложения и составив их, когда устройство простаивает. Это оптимизирует для дискового пространства и времени для загрузки кода с диска, тем самым сокращая время ожидания приложения. |
9 (уровень API 28) и выше | Частичный AOT (базовый + облачный профиль) | Play использует базовые профили во время установки приложений для оптимизации профилей APK и облаков, если доступно. После установки художественные профили загружаются для воспроизведения, агрегирования, а затем предоставляются в качестве облачных профилей для других пользователей при установке или обновлении приложения. |
Известные проблемы
Ниже приведены возможные проблемы и решения, или проблемы, для которых существуют постоянные разработки для обходных путей:
Генерация базового профиля может выйти из строя из -за настройки разрешения на некоторых устройствах, включая устройства OnePlus. Чтобы обойти это, отключите опцию «Отключить мониторинг разрешения» в настройках параметров разработчика .
Генерация базового профиля не поддерживается на устройствах тестовых лабораторий Firebase, в том числе управляемые Градл-управляемыми лабораторными устройствами ( выпуск № 285187547 ).
Чтобы успешно предоставить базовые профили для библиотек, используйте плагин Gradle Baseline Gradle 1.2.3 или AGP 8.3, как минимум ( выпуск № 313992099 ).
Если вы генерируете базовые профили с помощью Command
./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, может мешать установке профиля. Чтобы убедиться, что ваши профили будут эффективно установлены, отключите любые оптимизации батареи на ваших контрольных устройствах.
Дополнительные ресурсы
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создать базовые профили {:#Создание профиль-правила}
- Создать и измерить базовые профили без Macrobenchmark
- Оптимизация макета DEX и профили запуска
Базовые профили улучшают скорость выполнения кода примерно на 30% после первого запуска, избегая интерпретации и шагов компиляции Just In-Time (JIT) для включенных путей кода.
Отправляя базовый профиль в приложение или библиотеку, среда выполнения Android (ART) может оптимизировать указанные пути кода посредством компиляции (AOT) (AOT), обеспечивая повышение производительности для каждого нового пользователя и каждого обновления приложения. Этот профиль «Оптимизация» (PGO) позволяет приложениям оптимизировать запуск, уменьшить jank взаимодействия и улучшать общую производительность выполнения для пользователей с первого запуска.
Эти улучшения производительности напрямую приводят к улучшению бизнес -метрик, таким как удержание пользователей, транзакции и рейтинги. Вы можете прочитать больше о том, как производительность влияет на бизнес -метрики в рассказах от Джоша , Лифта , Тикток и Зомато .
Преимущества базовых профилей
Базовые профили делают все пользовательские взаимодействия, такие как запуск приложений, навигация между экранами или прокрутка через контент, а не первый раз, когда они запускаются. Увеличивая скорость и отзывчивость приложения, базовые профили могут привести к большему количеству ежедневных активных пользователей и более высокой средней скорости обратного посещения.
Базовые профили помогают направлять оптимизацию за пределами запуска приложений, предоставляя общие взаимодействия с пользователями, которые улучшают время выполнения приложения с первого запуска. Компиляция AOT с управляемым не полагается на пользовательские устройства и может быть выполнена после выпуска на машине разработки вместо мобильного устройства. Благодаря выбросам доставки с базовым профилем оптимизация приложений становится доступной гораздо быстрее, чем полагаясь только на облачные профили .
При отсутствии использования базового профиля весь код приложения либо JIT-считывается в памяти после интерпретации, либо записывается в файл odex
в фоновом режиме, когда устройство простоя. После установки или обновления приложения пользователи имеют неоптимальный опыт с первого раза, когда они запускают его, пока не будут оптимизированы новые пути кода. Многие приложения измеряют повышение производительности примерно на 30% после оптимизации.
Профили стартапов
Профили запуска похожи на базовые профили, но разница в том, что они используются во время компиляции, а не для оптимизации на устройстве. Профиль запуска используется для оптимизации макета файла DEX для улучшения времени запуска. Код, идентифицированный в профиле запуска, помещается в файл Primary classes.dex
, а другой код помещается в отдельные файлы DEX. Это улучшает время запуска за счет сокращения количества разломов страниц во время запуска приложения. Чтобы узнать больше о том, как профили запуска и оптимизация макета DEX могут улучшить время запуска приложений, см. Оптимизация макета DEX и профили запуска .
Начать
Чтобы начать оптимизировать производительность в вашем существующем приложении, см. Создать базовые профили .
Минимальные рекомендуемые стабильные версии
Цепочка зависимостей обеспечивает стабильные версии выпуска развития. Чтобы сгенерировать и установить базовый профиль, используйте следующие поддерживаемые версии или выше плагина Android Gradle, библиотеки Macrobenchmark и установщика профиля. Эти зависимости требуются в разное время и работают вместе в качестве набора инструментов, чтобы обеспечить оптимальный базовый профиль.
- Плагин Android Gradle:
com.android.tools.build:8.0.0
- Библиотека Macrobenchmark:
androidx.benchmark:benchmark-macro-junit4:1.3.4
- Установщик профиля:
androidx.profileinstaller:profileinstaller:1.4.1
Мы рекомендуем использовать последнюю версию AGP для создания и управления базовыми профилями. Вот основные функции, которые поставляются с разными версиями AGP:
Версия AGP | Функции |
---|---|
8.4 | Установка локальных приложений неразрешимых сборок с использованием инструмента командной строки Gradle Wroopper или Android Studio устанавливает базовые профили, поэтому производительность вашей локальной сборки выпуска больше совпадает с производством. Это обновление не влияет на производительность производства базовых профилей. |
8.3 |
|
8.2 |
|
8.0 | Минимальная рекомендуемая версия: используйте плагин базового профиля Gradle для создания базовых профилей с помощью одной задачи.
|
7.4 | Минимальная поддерживаемая версия: приложения могут потреблять базовые профили из библиотек и предоставлять свой собственный базовый профиль в файле src/main/baseline-prof.txt .
|
Пример генерации профиля
Ниже приведен пример класса для создания базового профиля для запуска приложения, а также несколько событий навигации и прокрутки с использованием рекомендуемой библиотеки MacroBenchmark :
@OptIn(ExperimentalBaselineProfilesApi::class)
class BaselineProfileGenerator {
@get:Rule
val baselineProfileRule = BaselineProfileRule()
@Test
fun appStartupAndUserJourneys() {
baselineProfileRule.collect(packageName = PACKAGE_NAME) {
// App startup journey.
startActivityAndWait()
device.findObject(By.text("COMPOSE LAZYLIST")).clickAndWait(Until.newWindow(), 1_000)
device.findObject(By.res("myLazyColumn")).also {
it.fling(Direction.DOWN)
it.fling(Direction.UP)
}
device.pressBack()
}
}
}
Вы можете увидеть этот код в полном контексте и более подробно как часть наших образцов производительности на GitHub .
Что включить
При использовании базовых профилей в приложении вы можете включить код запуска приложения и общие взаимодействия пользователей, такие как навигация между экранами или прокруткой. Вы также можете собрать целые потоки, такие как регистрация, вход или оплата. Любые поездки пользователей, которые вы считаете критическими, могут извлечь выгоду из базовых профилей, повышая их выполнение.
Если вы экспериментируете с различными подходами для повышения производительности, рассмотрите возможность включения базовых профилей для обоих рук вашего эксперимента. Делая это, вы можете облегчить интерпретацию своих результатов, обеспечивая постоянно запуск компилированного кода.
Библиотеки могут предоставлять свои собственные базовые профили и поставить их с релижами для повышения производительности приложений. Например, см. В разделе «Использовать базовый профиль» в JetPack Compose Performance .
Как работают базовые профили
При разработке вашего приложения или библиотеки рассмотрите возможность определения базовых профилей для охвата общих взаимодействий пользователей, где важно время рендеринга или задержки. Вот как они работают:
Для вашего приложения генерируются правила профиля, читаемые на человеке и скомпилируются в двоичную форму в приложении. Вы можете найти их в
assets/dexopt/baseline.prof
. Затем вы можете загрузить AAB в Google Play, как обычно.Google Play обрабатывает профиль и отправляет его непосредственно пользователям вместе с APK. Во время установки ART выполняет компиляцию AOT методов в профиле, что приводит к тому, что те методы выполняются быстрее. Если профиль содержит методы, используемые при запуске приложения или во время рендеринга кадров, пользователь может испытывать более быстрое время запуска и уменьшить Jank.
Этот поток взаимодействует с облачными профилями агрегации с точной настройкой, основанной на фактическом использовании приложения с течением времени.

Облачные профили
Облачные профили предлагают дополнительную форму 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 на первом забеге, когда модуль приложения определяет эту зависимость. Искусство может улучшить это дальше, добавив дополнительные правила профиля во время использования приложения и составив их, когда устройство простаивает. Это оптимизирует для дискового пространства и времени для загрузки кода с диска, тем самым сокращая время ожидания приложения. |
9 (уровень API 28) и выше | Частичный AOT (базовый + облачный профиль) | Play использует базовые профили во время установки приложений для оптимизации профилей APK и облаков, если доступно. После установки художественные профили загружаются для воспроизведения, агрегирования, а затем предоставляются в качестве облачных профилей для других пользователей при установке или обновлении приложения. |
Известные проблемы
Ниже приведены возможные проблемы и решения, или проблемы, для которых существуют постоянные разработки для обходных путей:
Генерация базового профиля может выйти из строя из -за настройки разрешения на некоторых устройствах, включая устройства OnePlus. Чтобы обойти это, отключите опцию «Отключить мониторинг разрешения» в настройках параметров разработчика .
Генерация базового профиля не поддерживается на устройствах тестовых лабораторий Firebase, в том числе управляемые Градл-управляемыми лабораторными устройствами ( выпуск № 285187547 ).
Чтобы успешно предоставить базовые профили для библиотек, используйте плагин Gradle Baseline Gradle 1.2.3 или AGP 8.3, как минимум ( выпуск № 313992099 ).
Если вы генерируете базовые профили с помощью Command
./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, может мешать установке профиля. Чтобы убедиться, что ваши профили будут эффективно установлены, отключите любые оптимизации батареи на ваших контрольных устройствах.
Дополнительные ресурсы
{% дословно %}Рекомендовано для вас
- Примечание: текст ссылки отображается, когда JavaScript отключен.
- Создать базовые профили {:#Создание профиль-правила}
- Создать и измерить базовые профили без Macrobenchmark
- Оптимизация макета DEX и профили запуска