Android 的共享程式庫會不時改進。保留預先建構的二進位檔 必須投注大量心力在 Android 中 9 以下版本的預先建構二進位檔 ,且只在執行階段無法連結已移除的程式庫或 ABI。開發人員必須 追蹤記錄,找出過時的預先建構二進位檔。在 Android 中 10,導入以符號為基礎的 ABI 使用檢查工具。 檢查工具可在建構時偵測過時的預先建構二進位檔,因此 程式庫開發人員可瞭解哪些預先建構的二進位檔可能會按照 以及必須重新建立哪些預先建構的二進位檔。
符號型 ABI 使用檢查工具
以符號為基礎的 ABI 用量檢查工具會模擬 主機。檢查工具會連結預先建構的二進位檔與 預先建構的二進位檔,並檢查所有未定義的符號是否已解析完畢。
首先,檢查工具會檢查預建二進位檔的目標架構。 如果預先建構的二進位檔不是指定 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