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