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

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 (постоянный эффект до тех пор, пока файл не будет удален). Для этого:

    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. Используйте конфигурацию устройства, чтобы установить следующие свойства на стороне сервера:

    persist.device_config.runtime_native_boot.profilesystemserver
    persist.device_config.runtime_native_boot.profilebootclasspath`
    

Создание профилей загрузочного образа

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

  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-файлам пути к классам загрузки, используя следующие команды:

    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 или к исходному коду.