Как запустить мониторинг ABI

В этой статье рассказывается, как создавать представления ABI ядра Android и выполнять мониторинг ABI. Оно применимо к Android 16 и более поздним версиям. Для более ранних версий см. ABI monitor previous kernel versions.

Также ознакомьтесь со справочной документацией по Kleaf: Поддержка мониторинга ABI (GKI) и Поддержка мониторинга ABI (устройство).

Создание ядра и его представления ABI

После скачивания исходного кода GKI выполните следующую команду, чтобы создать ядро GKI и артефакты ABI:

tools/bazel run //common:kernel_aarch64_abi_dist

Эта команда создает текущее представление ABI и копирует его в $DIST_DIR/abi.stg вместе с собранным ядром и модулями. $DIST_DIR Значение по умолчанию – out_abi/kernel_aarch64_abi_dist/dist.

В конце команды после -- можно указать дополнительные аргументы для инструментов ABI. Например, чтобы изменить целевой каталог для ABI и артефактов сборки, можно использовать параметр --destdir:

tools/bazel run //common:kernel_aarch64_abi_dist -- --destdir=out/dist

Анализировать различия ABI между сборкой и эталонным представлением

Цель //common:kernel_aarch64_abi_dist, выполненная в предыдущей команде, анализирует и сообщает о любых различиях ABI, обнаруженных между сборкой и эталонным представлением, расположенным по адресу common/gki/aarch64/abi.stg (определенному в BUILD.bazel). Эти различия выводятся в конце сборки, как показано в следующем примере:

INFO: From [stg] Comparing Kernel ABI @//common:kernel_aarch64_abi_diff:
INFO: ABI DIFFERENCES HAVE BEEN DETECTED!

Напечатанный отчет создается на основе артефакта сборки, расположенного по адресу $DIST_DIR/abi_stgdiff/abi.report.short, вместе с отчетами в других форматах.

Автоматизация должна использовать код выхода команды сборки, который будет ненулевым, если будут обнаружены различия.

Обратите внимание, что ветви фазы разработки, в том числе android-mainline, не имеют эталонного представления ABI. Без него //common:kernel_aarch64_abi_dist не сможет обнаружить различия.

Обновите представление ABI для эталонного устройства

Любое изменение, которое влияет на ABI ядра, например обновление списка символов, должно быть отражено в представлении эталонного ABI (common/gki/aarch64/abi.stg, определенном в BUILD.bazel). Для этого выполните следующую команду:

tools/bazel run //common:kernel_aarch64_abi_update

Эта команда выполняет все действия, описанные в разделе Анализ различий ABI, а также обновляет эталонное представление в источниках. Обновленный ABI можно загрузить в том же коммите, что и изменение. Включите в сообщение коммита различия ABI из отчета в $DIST_DIR/abi_stgdiff/abi.report.short.

Отслеживание ABI и таргетинг на устройства

Отслеживание ABI нужно настроить только для основных целевых объектов сборки ядра. Смешанные конфигурации сборки (те, которые определяют base_kernel), компилируемые непосредственно с ядром GKI, должны добавить поддержку отслеживания списка символов устройства. Определение ABI следует обновить с помощью сборки GKI.

Также ознакомьтесь со справочной документацией по Kleaf: Поддержка мониторинга ABI (устройство).

Монитор ABI для предыдущих версий ядра (Android 15 и более ранние версии)

Для предыдущих версий ядра инструкции по созданию и мониторингу ABI отличаются следующим образом.

Android 14 и 15

Инструкции в основном такие же, как для Android 16, но эталонное представление ABI – common/android/abi_gki_aarch64.stg и $DIST_DIR, а по умолчанию используется out_abi/kernel_aarch64/dist.

Android 13

Android 13 можно собрать с помощью Kleaf или устаревших скриптов сборки.

Для Kleaf инструкции такие же, как и для Android 14, за исключением того, что ABI имеет формат XML, а эталонное представление ABI – common/android/abi_gki_aarch64.xml.

Для устаревших скриптов сборки инструкции такие же, как для Android 12.

Android 12 и более ранние версии

Формат ABI – XML, а его представление в виде ссылки выглядит так:common/android/abi_gki_aarch64.xml

В этих ядрах вместо Kleaf используется build.sh. Для мониторинга ABI используйте build_abi.sh. Он принимает те же переменные среды для настройки сборки, что и build.sh. Пример:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh

Это позволяет создать ядро и извлечь представление ABI в подкаталог OUT_DIR (по умолчанию out_abi). Это эквивалентно цели //common:kernel_aarch64_abi_dist Kleaf (см. Создание ядра и артефактов ABI).

Эталонное представление ABI хранится в android/abi_gki_aarch64.xml, как определено переменной ABI_DEFINITION в common/build.config.gki.aarch64.

Если вам нужно обновить представление ABI ядра, удобнее всего использовать параметры --update и --print-report:

BUILD_CONFIG=common/build.config.gki.aarch64 build/build_abi.sh --update --print-report

Команда --print-report выводит различия в ABI между существующим файлом и недавно сгенерированным ABI.

Параметр --update перезаписывает эталонное представление ABI. Кроме того, при использовании BUILD_CONFIG для устройства с настроенным KMI_SYMBOL_LIST выполняется обновление списка символов.