供應商原生開發套件 (VNDK) 需要對程式碼集進行多項變更,才能區分供應商和系統之間的疑慮。請按照下列指南,在供應商/原始設備製造商 (OEM) 程式碼庫中啟用 VNDK。
建構系統程式庫
建構系統包含多種物件,包括程式庫 (共用、靜態或標頭) 和二進位檔。
圖 1. 建構系統程式庫。
core程式庫是由系統映像檔使用,位於系統映像檔上。vendor、vendor_available、vndk或vndk-sp程式庫無法使用這些程式庫。cc_library { name: "libThatIsCore", ... }
- 供應商映像檔會使用
vendor-only(或proprietary) 程式庫。cc_library { name: "libThatIsVendorOnly", proprietary: true, # or: vendor: true, # (for things in AOSP) ... }
- 供應商圖片會使用
vendor_available程式庫,供應商圖片可能包含core的重複項目。cc_library { name: "libThatIsVendorAvailable", vendor_available: true, ... }
- 供應商映像檔會使用系統映像檔中的
vndk程式庫。cc_library { name: "libThatIsVndk", vendor_available: true, vndk: { enabled: true, } ... }
- 供應商映像檔會使用
vndk-sp程式庫,系統映像檔也會間接使用。cc_library { name: "libThatIsVndkSp", vendor_available: true, vndk: { enabled: true, support_system_process: true, } ... }
- 系統和供應商映像檔都會使用
llndk程式庫。cc_library { name: "libThatIsLlndk", llndk: { symbol_file: "libthatisllndk.map.txt" } ... }
如果程式庫標示為 vendor_available:true,系統會建構兩次:
- 平台一次 (因此會安裝到
/system/lib) - 一次用於供應商 (因此安裝至
/vendor/lib或 VNDK APEX)
程式庫的供應商版本是使用 -D__ANDROID_VNDK__ 建構而成。
這個旗標會停用私人系統元件,這些元件在日後版本的 Android 中可能會大幅變更。此外,不同程式庫會匯出不同的標頭集 (例如 liblog)。目標供應商變體專用的選項可在以下位置的 Android.bp 檔案中指定:
target: { vendor: { … } }為程式碼集啟用 VNDK
如要為程式碼集啟用 VNDK,請按照下列步驟操作:
- 計算
vendor.img和system.img分區的必要大小,判斷是否符合資格。 - 啟用
BOARD_VNDK_VERSION=current。您可以將其新增至BoardConfig.mk,或直接使用該元件建構元件 (例如m -j BOARD_VNDK_VERSION=current MY-LIB)。
啟用 BOARD_VNDK_VERSION=current 後,建構系統會強制執行下列依附元件和標頭需求。
管理依附元件
依附於 vndk 中不存在的 core 元件,或依附於 vendor 物件的 vendor 物件,必須使用下列其中一個選項解決:
- 可以移除依附元件。
- 如果
core元件由vendor擁有,則可標示為vendor_available或vendor。 - 將核心物件納入
vndk的變更可能會上傳至 Google。
此外,如果 core 元件依附於 vendor 元件,則 vendor 元件必須轉換為 core 元件或以其他方式移除依附元件 (例如移除依附元件,或將依附元件移至 vendor 元件)。
管理標頭
必須移除全域標頭依附元件,建構系統才能判斷是否要使用 -D__ANDROID_VNDK__ 建構標頭。舉例來說,您仍可使用標頭程式庫 libutils_headers 存取 libutils 標頭,例如 utils/StrongPointer.h。
部分標頭 (例如 unistd.h) 無法再以遞移方式納入,但可以納入本機。
最後,private/android_filesystem_config.h 的公開部分已移至 cutils/android_filesystem_config.h。如要管理這些標題,請執行下列其中一項操作:
- 移除對
private/android_filesystem_config.h的依附元件,盡可能將所有AID_*巨集替換為getgrnam/getpwnam呼叫。例如:(uid_t)AID_WIFI會變成getpwnam("wifi")->pw_uid。(gid_t)AID_SDCARD_R會變成getgrnam("sdcard_r")->gr_gid。
private/android_filesystem_config.h。 - 如為硬式編碼 AIS,請加入
cutils/android_filesystem_config.h。