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

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

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