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
庫由系統和供應商映像使用。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 標頭(例如utils/StrongPointer.h
仍然可以使用標頭庫libutils_headers
進行存取。
某些標頭(例如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
。