Профили загрузочного образа

Android 11 и более поздние версии поддерживают создание профилей загрузочных образов, которые содержат информацию о коде различных компонентов системного уровня, таких как системный сервер и путь к классам загрузки. Среда выполнения Android (ART) использует эту информацию для выполнения общесистемных оптимизаций, некоторые из которых критически важны для производительности Android и влияют на выполнение всего ненативного кода (на уровне системы или приложения). В некоторых случаях профили загрузочных образов могут влиять на производительность выполнения и потребление памяти на двузначные проценты.

Получить информацию о профиле загрузки

Профили образов загрузки формируются на основе профилей приложений, выполняемых во время критических пользовательских действий (CUJ). В определённой конфигурации устройства ART собирает (в рамках профилей JIT) методы и классы пути к классам загрузки, используемые приложениями, а затем записывает эту информацию в профиль приложения (например, /data/misc/profiles/cur/0/com.android.chrome/primary.prof ), где она индексируется исполняемым файлом Dalvik (DEX) пути к классам загрузки (см. Формат профиля ART ).

Просмотрите профили приложений, записанные во время CUJ, чтобы определить, какая часть пути к классам загрузки используется чаще всего и наиболее важна для оптимизации (например, см. Формат профиля ART ). Включение всех методов или классов негативно влияет на производительность, поэтому сосредоточьтесь на наиболее часто используемых путях кода. Например, если метод из пути к классам загрузки используется одним приложением, он не должен быть частью профилей загрузки. Каждое устройство должно настраивать выбор метода/класса на основе выбора CUJ и объёма данных, полученных в ходе тестирования.

Чтобы агрегировать информацию о classpath загрузки из всех отдельных профилей приложений на устройстве, выполните команду 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 ) или методам, которые могут использоваться нечасто, но все же важны (например, методы, используемые приложением камеры).

Формат профиля аннотирует каждый метод несколькими флагами (запуск, пост-запуск, «горячесть», abi), что больше, чем отображается в формате «только дамп». Чтобы использовать все сигналы, измените доступные скрипты.

Рекомендации

Для достижения наилучших результатов следуйте следующим рекомендациям.

  • Разверните конфигурацию для генерации профилей загрузочных образов на нескольких тестовых устройствах и агрегируйте результаты перед созданием финального профиля загрузочного образа. Инструмент profman поддерживает агрегацию и выбор нескольких профилей загрузочных образов, но работает только с одной версией загрузочного образа (с одним и тем же classpath для загрузки).

  • Отдайте приоритет методам/классам, используемым системными процессами. Эти методы/классы могут использовать код, который редко используется другими приложениями, но всё равно критически важен для оптимизации.

  • Форма данных, полученная при запуске одного устройства, сильно отличается от данных, полученных на тестовых устройствах, на которых выполняются реальные 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 (действует постоянно до удаления файла). Для этого:

    1. Создайте файл local.prop со следующим содержимым:

      dalvik.vm.profilebootclasspath=true
      dalvik.vm.profilesystemserver=true
      
    2. Выполните следующие команды:

      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
    

Генерация профилей загрузочных образов

Используйте следующие инструкции для создания базового профиля загрузочного образа с помощью тестирования на одном устройстве.

  1. Настройте устройство.

    1. Настройте устройство, как описано в разделе Настройка устройств .

    2. (Необязательно) Для очистки и замены других профилей новым форматом требуется время. Чтобы ускорить сбор профилей, сбросьте все профили на устройстве.

      adb shell stop
      adb shell find "/data/misc/profiles -name *.prof -exec truncate -s 0 {} \;"
      adb shell start
    3. Запустите CUJ на устройстве.

  2. Захватите профиль с помощью следующей команды:

    adb shell cmd package snapshot-profile android
  3. Извлеките профиль с помощью следующей команды:

    adb pull /data/misc/profman/android.prof
  4. Перейдите к JAR-файлам classpath загрузки с помощью следующих команд:

    m dist
    ls $ANDROID_PRODUCT_OUT/boot.zip
  5. Создайте профиль загрузочного образа с помощью следующей команды profman .

    profman --generate-boot-image-profile --profile-file=android.prof --out-profile-path=... --out-preloaded-classes-path=...
  6. Используя данные, настройте команду profman , используя доступные флаги порога выбора.

    • --method-threshold
    • --class-threshold
    • --clean-class-threshold
    • --preloaded-class-threshold
    • --upgrade-startup-to-hot
    • --special-package

    Чтобы просмотреть полный список, обратитесь к странице справки profman или к исходному коду.