Встроенная проверка использования 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

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

Чтобы запустить программу проверки, установите для переменной среды CHECK_ELF_FILES значение true и запустите make check-elf-files :

CHECK_ELF_FILES=true make check-elf-files

Чтобы включить проверку по умолчанию, добавьте PRODUCT_CHECK_ELF_FILES в BoardConfig.mk :

PRODUCT_CHECK_ELF_FILES := true

Предварительные сборки автоматически проверяются в процессе сборки Android:

make