Android 11 или выше поддерживает создание профилей загрузочных образов, которые инкапсулируют информацию о коде различных компонентов системного уровня, таких как системный сервер и путь к классам загрузки. Android Runtime (ART) использует эту информацию для выполнения общесистемных оптимизаций, некоторые из которых имеют решающее значение для производительности Android и влияют на выполнение всего ненативного кода (уровень системы или приложения). В некоторых случаях профили загрузочных образов могут влиять на производительность выполнения и потребление памяти на двузначные проценты.
Получить информацию о профиле загрузки
Профили образов загрузки выводятся из профилей приложений, выполняемых во время критических пользовательских путешествий (CUJ). В определенной конфигурации устройства ART захватывает (как часть профилей JIT) методы и классы пути к классам загрузки, используемые приложениями, затем записывает эту информацию в профиль приложения (например, /data/misc/profiles/cur/0/com.android.chrome/primary.prof
), где она индексируется файлом Dalvik EXecutable (DEX) пути к классам загрузки (см. Формат профиля ART ).
Просмотрите профили приложений, записанные во время CUJ, чтобы определить, какая часть пути к классам загрузки используется чаще всего и является наиболее важной для оптимизации (например, см. Формат профиля ART ). Включение всех методов или классов отрицательно влияет на производительность, поэтому сосредоточьтесь на наиболее часто используемых путях кода. Например, если метод из пути к классам загрузки используется одним приложением, он не должен быть частью профилей загрузки. Каждое устройство должно настроить выбор метода/класса на основе выбора CUJ и объема данных, полученных в результате тестирования.
Чтобы объединить информацию о classpath загрузки из всех индивидуальных профилей приложений на устройстве, выполните команду 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: Используйте конфигурацию устройства для установки следующих свойств на стороне сервера:
adb shell device_config put runtime_native_boot profilebootclasspath true adb shell device_config put runtime_native_boot profilesystemserver true
Генерация профилей загрузочных образов
Используйте следующие инструкции для создания базового профиля загрузочного образа с помощью тестирования на одном устройстве.
Настройте устройство.
Настройте устройство, как описано в разделе Настройка устройств .
(Необязательно) Для очистки и замены других профилей новому формату профиля требуется время. Чтобы ускорить сбор профилей, сбросьте все профили на устройстве.
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-файлам classpath загрузки, используя следующие команды:
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
или к исходному коду.-