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