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

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