供應商原生開發套件 (VNDK) 需要對程式碼庫進行幾項變更,才能將供應商和系統之間的疑慮區隔開來。請參閱以下指南,在供應商/原始設備製造商程式碼集中啟用 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
,或直接使用該元件建構元件 (例如m -j BOARD_VNDK_VERSION=current MY-LIB
)。
啟用 BOARD_VNDK_VERSION=current
後,建構系統會強制執行下列依附元件和標頭規定。
管理依附元件
如果 vendor
物件依附於 core
元件,而該元件不存在於 vndk
中,或以 vendor
物件形式存在,則必須使用下列其中一個選項進行解析:
- 可以移除依附元件。
- 如果
core
元件由vendor
擁有,則可標示為vendor_available
或vendor
。 - 變更內容可能會將核心物件納入
vndk
,並上傳至 Google。
此外,如果 core
元件依附於 vendor
元件,則必須將 vendor
元件設為 core
元件,或者必須以其他方式移除依附元件 (例如移除依附元件,或將依附元件移至 vendor
元件)。
管理標頭
必須移除全域標頭依附元件,讓建構系統知道是否要使用 -D__ANDROID_VNDK__
建構標頭。舉例來說,您仍可使用標頭程式庫 libutils_headers
存取 utils/StrongPointer.h
等 libutils 標頭。
部分標頭 (例如 unistd.h
) 無法再透過轉介方式納入,但可在本機納入。
最後,private/android_filesystem_config.h
的公開部分已移至 cutils/android_filesystem_config.h
。如要管理這些標頭,請執行下列任一操作:
- 盡可能將所有
AID_*
巨集替換為getgrnam
/getpwnam
呼叫,以移除對private/android_filesystem_config.h
的依附元件。例如:(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
。