Android 11 или более поздней версии поддерживает создание профилей загрузочных образов, которые инкапсулируют информацию о коде различных компонентов системного уровня, таких как системный сервер и путь к классам загрузки. Среда выполнения Android (ART) использует эту информацию для выполнения общесистемных оптимизаций, некоторые из которых имеют решающее значение для производительности Android и влияют на выполнение всего неродного кода (на уровне системы или приложения). В некоторых случаях профили загрузочного образа могут влиять на производительность выполнения и потребление памяти в двузначных процентах.
Получить информацию о загрузочном профиле
Профили загрузочного образа создаются на основе профилей приложений, выполняемых во время критических циклов взаимодействия пользователя (CUJ). В конкретной конфигурации устройства ART фиксирует (как часть профилей JIT) методы и классы пути к классам загрузки, используемые приложениями, а затем записывает эту информацию в профиль приложения (например, /data/misc/profiles/cur/0/com.android.chrome/primary.prof
), где он индексируется по пути к загрузочному файлу Dalvik EXecutable (DEX) (см. формат профиля ART ).
Просмотрите профили приложений, записанные во время CUJ, чтобы определить, какая часть пути к классам загрузки наиболее используется и наиболее важна для оптимизации (например, см. раздел Формат профиля ART ). Включение всех методов или классов отрицательно влияет на производительность, поэтому сосредоточьтесь на наиболее часто используемых путях кода. Например, если метод из пути к классам загрузки используется одним приложением, он не должен быть частью профилей загрузки. Каждое устройство должно настроить выбор метода/класса на основе выбора CUJ и объема данных, полученных в результате тестирования.
Чтобы собрать информацию о пути к классам загрузки из всех отдельных профилей приложений на устройстве, выполните команду adb shell cmd package snapshot-profile android
. Вы можете использовать агрегированную информацию в качестве основы для обработки и выбора метода/класса без агрегирования отдельных профилей вручную (хотя вы можете сделать это при желании).
Рисунок 1. Процесс получения профилей загрузочного образа
Данные профиля загрузочного образа
Профили загрузочного образа включают следующие файлы и данные.
Профиль для пути к классам загрузки (
frameworks/base/config/boot-image-profile.txt
). Определяет, какие методы из пути к классам загрузки оптимизируются, какой класс включается в загрузочный.art
образ и как размещаются соответствующие файлы DEX.Список предустановленных классов . Определяет, какие классы предварительно загружены в 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
) или методам, которые могут не использоваться широко, но по-прежнему важны (например, методы, используемые приложение камеры).
Формат профиля внутренне аннотирует каждый метод несколькими флагами (запуск, после запуска, горячность, abi), что больше, чем отображается в формате только для дампа. Чтобы использовать все сигналы, измените доступные скрипты.
Рекомендации
Для достижения наилучших результатов используйте следующие рекомендации.
Разверните конфигурацию для создания профилей загрузочного образа на нескольких тестовых устройствах и агрегируйте результаты перед созданием окончательного профиля загрузочного образа. Инструмент
profman
поддерживает агрегирование и выбор нескольких профилей загрузочного образа, но он работает только с одной и той же версией загрузочного образа (один и тот же путь к классам загрузки).Отдайте приоритет выбора методам/классам, которые используются системными процессами. Эти методы/классы могут использовать код, который не часто используется другими приложениями, но который по-прежнему важен для оптимизации.
Форма данных от одного запуска устройства выглядит совсем иначе по сравнению с тестовыми устройствами, которые выполняют реальные CUJ. Если у вас нет большого парка тестовых устройств, используйте одно и то же устройство для запуска нескольких CUJ, чтобы повысить уверенность в том, что оптимизация профиля загрузочного образа будет хорошо работать в рабочей среде (этот сценарий описан ниже).
Настройка устройств
Чтобы включить настройку профиля загрузки через свойства системы, используйте один из следующих методов.
Вариант 1: Настроить реквизит вручную (работает до перезагрузки):
adb root
adb shell stop
adb shell setprop dalvik.vm.profilebootclasspath true
adb shell setprop dalvik.vm.profilesystemserver true
adb 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.prop
adb reboot
Вариант 3. Используйте конфигурацию устройства, чтобы установить следующие свойства на стороне сервера:
persist.device_config.runtime_native_boot.profilesystemserver persist.device_config.runtime_native_boot.profilebootclasspath`
Создание профилей загрузочного образа
Используйте следующие инструкции, чтобы создать базовый профиль загрузочного образа с помощью тестирования на одном устройстве.
Настройте устройство.
Настройте устройство, как описано в разделе Настройка устройств .
(Необязательно) Для очистки и замены других профилей новым форматом профиля требуется время. Чтобы ускорить сбор профилей, сбросьте все профили на устройстве.
adb shell stop
adb 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-файлам пути к классам загрузки, используя следующие команды:
m dist
ls $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
или к исходному коду.-