預先建置的 ABI 用法檢查器

Android 共享庫不斷發展。讓預先建置的二進位檔案保持最新需要付出相當大的努力。在 Android 9 或更早版本中,依賴已刪除的庫或 ABI 的預先建置二進位檔案僅在運行時無法連結。開發人員必須追蹤日誌才能找到過時的預先建置二進位。在 Android 10 中,引進了基於符號的 ABI 使用檢查器。檢查器可以在建置時檢測過時的預先建置二進位文件,以便共用程式庫開發人員可以知道哪些預先建置二進位檔案可能會因其變更而被破壞以及哪些預先建置二進位檔案必須重新建置。

基於符號的 ABI 用法檢查器

基於符號的 ABI 使用檢查器模擬主機上的 Android 動態連結器。檢查器將預先建置的二進位檔案與預先建置的二進位檔案的依賴項連結起來,並檢查是否所有未定義的符號都已解析。

首先,檢查器檢查預先建置二進位檔案的目標架構。如果預先建置的二進位檔案不針對 ARM、AArch64、x86 或 x86-64 架構,則檢查器會跳過預先建置的二進位檔案。

其次,預先建置二進位檔案的依賴項必須在LOCAL_SHARED_LIBRARIESshared_libs中列出。建置系統將模組名稱解析為共享庫的匹配變體(即corevendor )。

第三,檢查器將DT_NEEDED條目與LOCAL_SHARED_LIBRARIESshared_libs進行比較。特別是,檢查器從每個共享庫中提取DT_SONAME條目,並將這些DT_SONAME與預先建置二進位檔案中記錄的DT_NEEDED條目進行比較。如果不匹配,則會發出錯誤訊息。

第四,檢查器解析預先建構二進位檔案中未定義的符號。這些未定義的符號必須在依賴項之一中定義,且符號綁定必須是GLOBALWEAK 。如果無法解析未定義的符號,則會發出錯誤訊息。

預建模塊屬性

預先建置二進位檔案的依賴關係必須在下列之一中指定:

  • 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

運行檢查器

檢查器涵蓋了 Android 建置過程中的所有 ELF 預建模組。

若要單獨運轉檢查器以加快週轉時間:

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>