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
。