預先建構的 ABI 用量檢查工具

Android 的共享程式庫會不時改進。保留預先建構的二進位檔 必須投注大量心力在 Android 中 9 以下版本的預先建構二進位檔 ,且只在執行階段無法連結已移除的程式庫或 ABI。開發人員必須 追蹤記錄,找出過時的預先建構二進位檔。在 Android 中 10,導入以符號為基礎的 ABI 使用檢查工具。 檢查工具可在建構時偵測過時的預先建構二進位檔,因此 程式庫開發人員可瞭解哪些預先建構的二進位檔可能會按照 以及必須重新建立哪些預先建構的二進位檔。

符號型 ABI 使用檢查工具

以符號為基礎的 ABI 用量檢查工具會模擬 主機。檢查工具會連結預先建構的二進位檔與 預先建構的二進位檔,並檢查所有未定義的符號是否已解析完畢。

首先,檢查工具會檢查預建二進位檔的目標架構。 如果預先建構的二進位檔不是指定 ARM、AArch64、x86 或 x86-64 檢查工具就會略過預先建構的二進位檔。

其次,預先建構二進位檔的依附元件必須列於 LOCAL_SHARED_LIBRARIESshared_libs。建構作業 系統會將模組名稱解析為相符的變化版本 (即 core 對比vendor) 的共用程式庫。

第三,檢查工具會將 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

執行檢查工具

如要執行檢查工具,請設定環境變數 CHECK_ELF_FILEStrue 並執行 make check-elf-files:

CHECK_ELF_FILES=true make check-elf-files

如要預設啟用檢查工具,請新增 PRODUCT_CHECK_ELF_FILESBoardConfig.mk

PRODUCT_CHECK_ELF_FILES := true

在 Android 建構程序中,系統會自動檢查預先建構:

make