VNDK 需要對代碼庫進行多次更改,以區分供應商和系統之間的關注點。使用以下指南在供應商/OEM 代碼庫中啟用 VNDK。
構建系統庫
構建系統包含多種類型的對象,包括庫(共享、靜態或標頭)和二進製文件。

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庫。llndk_library { name: "libThatIsLlndk", }
當一個庫被標記為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訪問諸如utils/StrongPointer.h之類的 libutils 頭文件。
某些標頭(例如unistd.h )不能再被包含,但可以在本地包含。
最後, private/android_filesystem_config.h的公共部分已移至cutils/android_filesystem_config.h 。要管理這些標頭,請執行以下操作之一:
- 如果可能的話,通過用
getgrnam/getpwnam調用替換所有AID_*宏來移除對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。