供應商原生開發套件 (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" } ... }
如果 lib 標示為 vendor_available:true
,就會建構該 lib
兩次:
- 一次針對平台 (並安裝至
/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
後,建構系統
強制執行下列依附元件和標頭規定。
管理依附元件
依附 core
元件的 vendor
物件
不存在於 vndk
中,或做為 vendor
物件
必須透過下列其中一個選項解決:
- 您可以移除依附元件。
- 如果
core
元件的擁有者為vendor
,即可 標示為vendor_available
或vendor
- 將
vndk
的核心物件做為變更可能 匯入 Google。
此外,如果 core
元件在
vendor
元件,必須建立 vendor
元件
轉換為 core
元件「或」依附元件必須
透過其他方式移除 (例如移除依附元件
分割成 vendor
元件)。
管理標頭
必須移除全域標頭依附元件,建構系統才能知道
無論是否使用 -D__ANDROID_VNDK__
建構標頭。
例如,utils/StrongPointer.h
等 libutils 標頭可以
仍可透過標頭程式庫存取
libutils_headers
。
無法再以遞移方式納入部分標頭 (例如 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
。