Android 11 и более поздние версии поддерживают создание профилей загрузочного образа, которые содержат информацию о коде различных системных компонентов, таких как системный сервер и путь к классам загрузки. Android Runtime (ART) использует эту информацию для выполнения общесистемных оптимизаций, некоторые из которых критически важны для производительности Android и влияют на выполнение всего не нативного кода (на системном или прикладном уровне). В некоторых случаях профили загрузочного образа могут влиять на производительность выполнения и потребление памяти на двузначные проценты.
Получить информацию о профиле загрузки
Профили образов загрузки формируются на основе профилей приложений, выполняемых во время критически важных пользовательских сценариев (CUJ). В конкретной конфигурации устройства ART захватывает (в рамках JIT-профилей) методы и классы пути загрузки, используемые приложениями, а затем записывает эту информацию в профиль приложения (например, /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), где она индексируется файлом исполняемого файла Dalvik (DEX) пути загрузки (см. формат профиля ART ).
Проанализируйте профили приложений, записанные во время тестирования CUJ, чтобы определить, какая часть пути к классам при загрузке используется чаще всего и наиболее важна для оптимизации (например, см. формат профиля ART ). Включение всех методов или классов негативно влияет на производительность, поэтому сосредоточьтесь на наиболее часто используемых участках кода. Например, если метод из пути к классам при загрузке используется только одним приложением, он не должен быть частью профиля загрузки. Каждое устройство должно настраивать выбор метода/класса на основе выбора CUJ и объема данных, полученных в ходе тестирования.
Чтобы собрать информацию о пути к классам при загрузке из всех отдельных профилей приложений на устройстве, выполните команду adb shell cmd package snapshot-profile android . Вы можете использовать собранную информацию в качестве основы для обработки и выбора метода/класса без ручного объединения отдельных профилей (хотя при желании это можно сделать).

Рисунок 1. Процесс получения профилей загрузочных образов.
Данные профиля загрузочного образа
Профили образов загрузки включают следующие файлы и данные.
Профиль для пути к классам загрузки (
frameworks/base/config/boot-image-profile.txt). Определяет, какие методы из пути к классам загрузки будут оптимизированы и какой класс будет включен в образ.artдля загрузки.Список предварительно загруженных классов . Определяет, какие классы предварительно загружены в Zygote.
Профиль для компонентов системного сервера (
frameworks/base/services/art-profile). Определяет, какие методы системного сервера будут оптимизированы/скомпилированы, какой класс будет включен в загрузочный образ.artи как будут организованы соответствующие DEX-файлы.
формат профиля ART
Профиль ART собирает информацию из каждого загруженного DEX-файла, включая сведения о методах, которые стоит оптимизировать, и классах, используемых при запуске. При включении профилирования образа загрузки ART также включает в профиль путь к классам загрузки и JAR-файлы системного сервера, а также аннотирует каждый DEX-файл именем пакета, который его использует.
Например, вы можете выгрузить необработанный профиль загрузочного образа с помощью следующей команды:
adb shell profman --dump-only --profile-file=/data/misc/profman/android.profВ результате получается примерно следующий результат:
=== Dex files ===
=== profile ===
ProfileInfo [012]
core-oj.jar:com.google.android.ext.services [index=0] [checksum=e4e3979a]
hot methods: 520[], 611[] …
startup methods: …
classes: …
...
core-oj.jar:com.android.systemui [index=94] [checksum=e4e3979a]
hot methods: 520[], 521[]…
startup methods: …
classes: …
В приведенном выше примере:
core-oj.jarиспользуется компонентамиcom.google.android.ext.servicesиcom.android.systemui. В каждой записи указаны два пакета, используемые изcore-oj.jar.Оба процесса используют метод с индексом DEX 520, но только процесс
systemuiиспользует метод с индексом DEX 521. Та же логика применима и к другим разделам профиля (например, к классам запуска).
В процессе обработки данных фильтруйте методы/классы на основе их использования, отдавая приоритет процессам системного уровня (например, системному серверу или systemui ) или методам, которые могут использоваться нечасто, но все же важны (например, методам, используемым приложением камеры).
Внутренний формат профилирования аннотирует каждый метод несколькими флагами (startup, post-startup, hotness, abi), что больше, чем отображается в формате, содержащем только дамп. Чтобы использовать все сигналы, измените доступные скрипты.
Рекомендации
Для достижения наилучших результатов следуйте приведенным ниже рекомендациям.
Разверните конфигурацию для генерации профилей загрузочных образов на нескольких тестовых устройствах и объедините результаты перед генерацией окончательного профиля загрузочного образа. Инструмент
profmanподдерживает объединение и выбор нескольких профилей загрузочных образов, но работает только с одной и той же версией загрузочного образа (одним и тем же путем к классам загрузки).При выборе методов/классов отдавайте приоритет тем, которые используются системными процессами. Эти методы/классы могут использовать код, который редко используется другими приложениями, но который все равно крайне важно оптимизировать.
Форма данных, полученных в результате запуска на одном устройстве, значительно отличается от формы данных на тестовых устройствах, выполняющих реальные CUJ-запросы. Если у вас нет большого парка тестовых устройств, используйте одно и то же устройство для запуска нескольких CUJ-запросов, чтобы повысить уверенность в том, что оптимизация профиля загрузочного образа будет хорошо работать в производственной среде (этот сценарий описан ниже).
Настройка устройств
Для включения настройки профиля загрузки через свойства системы воспользуйтесь одним из следующих способов.
Вариант 1: Настройка свойств вручную (работает до перезагрузки):
adb rootadb shell stopadb shell setprop dalvik.vm.profilebootclasspath trueadb shell setprop dalvik.vm.profilesystemserver trueadb shell startВариант 2: Использовать файл
local.prop(эффект сохраняется до удаления файла). Для этого:Создайте файл
local.propсо следующим содержимым:dalvik.vm.profilebootclasspath=true dalvik.vm.profilesystemserver=trueВыполните следующие команды:
adb push local.prop /data/adb shell chmod 0750 /data/local.propadb reboot
Вариант 3: Используйте конфигурацию устройства для установки следующих параметров на стороне сервера:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Создание профилей загрузочных образов
Следуйте приведенным ниже инструкциям, чтобы создать базовый профиль загрузочного образа, протестировав его на одном устройстве.
Настройте устройство.
Настройте устройство, как описано в разделе «Настройка устройств» .
(Необязательно) Для очистки и замены других профилей в новом формате профиля требуется время. Чтобы ускорить сбор профилей, сбросьте все профили на устройстве.
adb shell stopadb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"adb shell startЗапустите CUJ-файлы на устройстве.
Создайте профиль, используя следующую команду:
adb shell cmd package snapshot-profile androidИзвлеките профиль, используя следующую команду:
adb pull /data/misc/profman/android.profДля перехода к JAR-файлам в загрузочном classpath используйте следующие команды:
m distls $ANDROID_PRODUCT_OUT/boot.zipСоздайте профиль загрузочного образа, используя следующую команду
profman.profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...Используя данные, настройте команду
profman, применив доступные флаги порогового значения выбора.-
--method-threshold -
--class-threshold -
--clean-class-threshold -
--preloaded-class-threshold -
--upgrade-startup-to-hot -
--special-package
Чтобы просмотреть полный список, обратитесь к справочной странице
profmanили исходному коду.-