Встроенная проверка использования ABI

Общие библиотеки Android периодически меняются. Поддержание актуальности готовых двоичных файлов требует значительных усилий. В Android 9 и более ранних версиях готовые двоичные файлы, зависящие от удалённых библиотек или ABI, не линкуются только во время выполнения. Разработчикам приходится отслеживать журналы, чтобы найти устаревшие готовые двоичные файлы. В Android 10 представлен инструмент проверки использования ABI на основе символов. Этот инструмент может обнаруживать устаревшие готовые двоичные файлы во время сборки, чтобы разработчики общих библиотек могли знать, какие готовые двоичные файлы могут быть повреждены в результате внесённых изменений, и какие из них необходимо пересобрать.

Проверка использования ABI на основе символов

Проверка использования ABI на основе символов эмулирует динамический компоновщик Android на хосте. Проверка связывает готовый двоичный файл с его зависимостями и проверяет, разрешены ли все неопределённые символы.

Сначала программа проверки проверяет целевую архитектуру готового двоичного файла. Если готовая архитектура не предназначена для архитектуры ARM, AArch64, x86 или x86-64, программа проверки пропускает готовый двоичный файл.

Во-вторых, зависимости готового двоичного файла должны быть указаны в LOCAL_SHARED_LIBRARIES или shared_libs . Система сборки определяет имена модулей в соответствии с вариантом (например, core или vendor ) общих библиотек.

В-третьих, программа проверки сравнивает записи DT_NEEDED с LOCAL_SHARED_LIBRARIES или shared_libs . В частности, программа проверки извлекает запись DT_SONAME из каждой разделяемой библиотеки и сравнивает эти DT_SONAME с записями DT_NEEDED , записанными в предварительно собранном двоичном файле. В случае несоответствия выдаётся сообщение об ошибке.

В-четвертых, программа проверки разрешает неопределенные символы в предварительно собранном двоичном файле. Эти неопределенные символы должны быть определены в одной из зависимостей, а привязка символов должна быть либо GLOBAL , либо WEAK . Если неопределенный символ не может быть разрешен, выдается сообщение об ошибке.

Свойства готовых модулей

Зависимости предварительно собранного двоичного файла должны быть указаны в одном из следующих вариантов:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Если готовый двоичный файл содержит некоторые неразрешимые неопределенные символы , укажите одно из следующих:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Чтобы готовый двоичный файл пропустил проверку ELF-файла, укажите одно из следующих:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Запустить проверку

Средство проверки охватывает все предварительно собранные модули ELF в процессе сборки Android.

Чтобы запустить проверку отдельно и ускорить обработку данных:

m check-elf-files

Исправление ошибок ABI

Автоматический фиксер поможет устранить ошибки проверки ABI. Просто запустите фиксер, указав в качестве входных данных файл Android.bp / Android.mk, и он выведет предлагаемое исправление на стандартный вывод. При желании можно запустить фиксер с опцией --in-place чтобы напрямую обновить Android.bp / Android.mk, добавив предлагаемое исправление.

Для Android.bp,

m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>

Для Android.mk,

m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>