Android VNDK使用及原理深入探究
為何要使用 VNDK?
VNDK的全稱(chēng)是Vendor Native Development Kit,是Android 8.0引入的一種新技術(shù)。它表現(xiàn)一系列庫(kù)的合集,用于讓供應(yīng)商開(kāi)發(fā)自己的HALs。VNDK 包含在 system.img 中,并在運(yùn)行時(shí)與供應(yīng)商代碼動(dòng)態(tài)關(guān)聯(lián)。
官方文檔的解釋給我的感覺(jué)其目的就是收斂Android的碎片化。不僅僅VNDK,Android 8.0引入許多的技術(shù)都是為了將System與Vendor分割開(kāi)來(lái)。這樣可以保持Android核心系統(tǒng)的純凈性,而將碎片化扔給供應(yīng)商維護(hù)。漸漸的芯片供應(yīng)商和設(shè)備廠(chǎng)商可以無(wú)需關(guān)心Android系統(tǒng)的實(shí)現(xiàn),僅僅使用VNDK就可以完成產(chǎn)品開(kāi)發(fā)。
VNDK相關(guān)概念
供應(yīng)商模塊
供應(yīng)商模塊是特定于供應(yīng)商的可執(zhí)行文件或共享庫(kù),這些模塊將安裝到供應(yīng)商分區(qū)中。
- 在
Android.bp文件中,供應(yīng)商模塊必須將vendor或proprietary屬性設(shè)置為true。 - 在
Android.mk文件中,供應(yīng)商模塊必須將LOCAL_VENDOR_MODULE或LOCAL_PROPRIETARY_MODULE設(shè)置為true。
Framework共享庫(kù)
在理想的Android 8.0及更高版本環(huán)境中,F(xiàn)ramework進(jìn)程不加載供應(yīng)商共享庫(kù),而供應(yīng)商進(jìn)程僅加載供應(yīng)商共享庫(kù)(和一部分Framework共享庫(kù))。Framework進(jìn)程與供應(yīng)商進(jìn)程之間的通信由HIDL和hardware binder控制。
供應(yīng)商進(jìn)程需要使用Framework共享庫(kù)可能隨系統(tǒng)的更新而發(fā)生變化。為了保證供應(yīng)商模塊在多個(gè)Android版本上皆可正常工作,根據(jù)Framework共享庫(kù)的特性不同,將其三個(gè)子類(lèi)別:
- LL-NDK庫(kù):已知穩(wěn)定的Framework共享庫(kù),它們的開(kāi)發(fā)者致力于保持其 API/ABI 穩(wěn)定性。LL-NDK 包含以下庫(kù):
libEGL.so、libGLESv1_CM.so、libGLESv2.so、libGLESv3.so、libandroid_net.so、libc.so、libdl.so、liblog.so、libm.so、libnativewindow.so、libneuralnetworks.so、libsync.so、libvndksupport.so和libvulkan.so。 合格的 VNDK 庫(kù) (VNDK):可以安全復(fù)制兩次的Framework共享庫(kù)。Framework模塊和供應(yīng)商模塊可以與其各自的庫(kù)副本相關(guān)聯(lián)。Framework共享庫(kù)只有滿(mǎn)足以下條件才能成為合格的 VNDK 庫(kù):
- 不向Framework發(fā)送或從Framework接收 IPC。
- 與 ART 虛擬機(jī)無(wú)關(guān)。
- 不讀寫(xiě)文件格式不穩(wěn)定的文件/分區(qū)。
- 沒(méi)有需要法律審查的特殊軟件許可。
- 其代碼所有者不反對(duì)供應(yīng)商使用該庫(kù)。
框架專(zhuān)用庫(kù) (FWK-ONLY) :不屬于上述類(lèi)別的Framework共享庫(kù)。此類(lèi)庫(kù)具有以下特點(diǎn):
- 被視為Framework內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。
- 不得由供應(yīng)商模塊訪(fǎng)問(wèn)。
- 具有不穩(wěn)定的 ABI/API,無(wú) API/ABI 兼容性保證。
- 不會(huì)被復(fù)制。
LL-NDK
LL-NDK 共享庫(kù)是具有穩(wěn)定 ABI 的共享庫(kù)。框架模塊和供應(yīng)商模塊均具有相同的最新實(shí)現(xiàn)。對(duì)于每個(gè) LL-NDK 共享庫(kù),Android.bp 都包含一個(gè) llndk_library 模塊定義:
llndk_library {
name: "libvndksupport",
symbol_file: "libvndksupport.map.txt",
}該模塊定義指定了模塊名稱(chēng)和符號(hào)文件,后者描述了對(duì)供應(yīng)商模塊可見(jiàn)的符號(hào)。例如:
LIBVNDKSUPPORT {
global:
android_load_sphal_library; # vndk
android_unload_sphal_library; # vndk
local:
*;
};Same-Process HAL (SP-HAL)
Same-Process HAL (SP-HAL) 是預(yù)定義的的一組HAL,作為供應(yīng)商共享庫(kù)進(jìn)行實(shí)現(xiàn),并被加載到Framework進(jìn)程中。SP-HAL 必須僅依賴(lài)于 LL-NDK 和 VNDK-SP。VNDK-SP 是一部分預(yù)定義的符合條件的 VNDK 庫(kù)。VNDK-SP 庫(kù)會(huì)被仔細(xì)審查,以確保將 VNDK-SP 庫(kù)雙重加載到Framework進(jìn)程中不會(huì)導(dǎo)致問(wèn)題。SP-HAL 和 VNDK-SP 均由 Google 定義,并通過(guò)鏈接器命名空間進(jìn)行隔離。
以下庫(kù)是經(jīng)過(guò)批準(zhǔn)的 SP-HAL:
libGLESv1_CM_${driver}.solibGLESv2_${driver}.solibGLESv3_${driver}.solibEGL_${driver}.sovulkan.${driver}.soandroid.hardware.renderscript@1.0-impl.soandroid.hardware.graphics.mapper@2.0-impl.so
以下庫(kù)是 SP-HAL 可以訪(fǎng)問(wèn)的 VNDK-SP 庫(kù):
android.hardware.graphics.common@1.0.soandroid.hardware.graphics.mapper@2.0.soandroid.hardware.renderscript@1.0.so(Renderscript)libRS_internal.so(Renderscript)libbase.solibc++.solibcutils.solibhardware.solibhidlbase.solibhidltransport.solibhwbinder.solibion.solibutils.solibz.so
以下 VNDK-SP 依賴(lài)項(xiàng) (VNDK-SP-Private) 對(duì) SP-HAL 來(lái)說(shuō)是不可見(jiàn)的:
libRSCpuRef.so(Renderscript)libRSDriver.so(Renderscript)libbacktrace.solibblas.so(Renderscript)libbcinfo.so(Renderscript)liblzma.solibunwind.so
以下是具有 RS 例外的框架專(zhuān)用庫(kù) (FWK-ONLY-RS):
libft2.so(Renderscript)libmediandk.so(Renderscript)
VNDK 庫(kù)簡(jiǎn)介
VNDK 定義了可與供應(yīng)商代碼相關(guān)聯(lián)的庫(kù)集:VNDK-core、VNDK-SP 和 LL-NDK,并阻止供應(yīng)商使用不在 VNDK 集內(nèi)的庫(kù)。
VNDK-core 庫(kù)安裝在 /system/lib[64]/vndk-${VER} 中,僅適用于 API 級(jí)別為 ${VER} 的供應(yīng)商進(jìn)程。${VER} 可以通過(guò)/vendor/default.prop中的系統(tǒng)屬性ro.vndk.version獲取。系統(tǒng)進(jìn)程不得使用這些庫(kù),而必須使用安裝在 /system/lib[64] 中的庫(kù)。由于每個(gè)進(jìn)程都具有嚴(yán)格的命名空間限制,因此不會(huì)造成重復(fù)加載 VNDK-core 庫(kù)。要在 VNDK-core 中添加庫(kù),請(qǐng)將以下內(nèi)容添加到 Android.bp 中:
vendor_available: true,
vndk: {
enabled: true,
},VNDK-SP 庫(kù)安裝在 /system/lib[64]/vndk-sp-${VER} 中,可以被供應(yīng)商進(jìn)程和系統(tǒng)進(jìn)程(通過(guò)安裝在供應(yīng)商分區(qū)中的 SP-HAL 庫(kù))使用。VNDK-SP 庫(kù)可以重復(fù)加載。要在 VNDK-SP 中添加庫(kù),請(qǐng)將以下內(nèi)容添加到 Android.bp 中:
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
},LL-NDK 庫(kù)安裝在 /system/lib[64] 中。供應(yīng)商模塊可以使用 LL-NDK stub訪(fǎng)問(wèn) LL-NDK 庫(kù)的預(yù)選符號(hào)。LL-NDK 庫(kù)必須支持向后兼容,且具有 ABI 穩(wěn)定性,以便舊版供應(yīng)商模塊使用新版 LL-NDK 庫(kù)。由于 LL-NDK 具有 ABI 穩(wěn)定特性,VNDK 快照無(wú)需包含舊版供應(yīng)商映像的 LL-NDK 庫(kù)。
目錄
VNDK庫(kù)可以大致劃分為以下目錄:
/system/lib[64]包含所有Framework共享庫(kù),具體包括 LL-NDK、VNDK 和Framework專(zhuān)用庫(kù)(包括 LL-NDK-Private 和一些與 VNDK-SP 中的庫(kù)同名的庫(kù))。/system/lib[64]/vndk-sp包含適用于 Same-Process HAL 的 VNDK-SP 庫(kù)。/vendor/lib[64]包含供應(yīng)商擴(kuò)展的 VNDK 庫(kù)(DXUA 庫(kù)或 DXUX VNDK 庫(kù))、Same-Process HAL 實(shí)現(xiàn),以及其他供應(yīng)商共享庫(kù)。/vendor/lib[64]/vndk-sp可能包含供應(yīng)商擴(kuò)展的 VNDK-SP 庫(kù)。
供應(yīng)商模塊從 /system/lib[64] 中加載 VNDK 庫(kù)。
VNDK 電子表格
Google 會(huì)提供一個(gè)符合條件的 VNDK 電子表格(例如 eligible-list.csv),該電子表格會(huì)標(biāo)記可由供應(yīng)商模塊使用的框架共享庫(kù):
| 標(biāo)記 | 說(shuō)明 |
|---|---|
| LL-NDK | 可由框架模塊和供應(yīng)商模塊使用的共享庫(kù)(具有穩(wěn)定的 ABI/API)。 |
| LL-NDK-Private | LL-NDK 庫(kù)的私有依賴(lài)項(xiàng)。供應(yīng)商模塊不得直接訪(fǎng)問(wèn)此類(lèi)庫(kù)。 |
| VNDK-SP | SP-HAL 框架共享庫(kù)依賴(lài)項(xiàng)。 |
| VNDK-SP-Private | 所有供應(yīng)商模塊都無(wú)法直接訪(fǎng)問(wèn)的 VNDK-SP 依賴(lài)項(xiàng)。 |
| VNDK | 面向供應(yīng)商模塊(SP-HAL 和 SP-HAL-Dep 除外)提供的框架共享庫(kù)。 |
| VNDK-Private | 所有供應(yīng)商模塊都無(wú)法直接訪(fǎng)問(wèn)的 VNDK 依賴(lài)項(xiàng)。 |
| FWK-ONLY | 供應(yīng)商模塊不得(直接或間接)訪(fǎng)問(wèn)、僅限框架使用的共享庫(kù)。 |
| FWK-ONLY-RS | 供應(yīng)商模塊不得訪(fǎng)問(wèn)(RS 用途除外)、僅限框架使用的共享庫(kù)。 |
下表描述了適用于供應(yīng)商共享庫(kù)的標(biāo)記:
| 標(biāo)記 | 說(shuō)明 |
|---|---|
| SP-HAL | Same-Process HAL 實(shí)現(xiàn)共享庫(kù)。 |
| SP-HAL-Dep | SP-HAL 供應(yīng)商共享庫(kù)依賴(lài)項(xiàng)(也稱(chēng)為 SP-HAL 依賴(lài)項(xiàng),不包括 LL-NDK 和 VNDK-SP)。 |
| VND-ONLY | 框架模塊不可見(jiàn)且不得訪(fǎng)問(wèn)的共享庫(kù)。所復(fù)制的擴(kuò)展后 VNDK 庫(kù)也將被標(biāo)記為 VND-ONLY。 |
標(biāo)記之間的關(guān)系:

VNDK 快照
VNDK 快照就是一組預(yù)編譯的庫(kù)文件和配置文件的集合。因?yàn)閂NDK的實(shí)質(zhì)就是要規(guī)范供應(yīng)商的開(kāi)發(fā),如果保證VNDK接口穩(wěn)定的標(biāo)準(zhǔn)化,供應(yīng)商就無(wú)需修改VNDK庫(kù)。系統(tǒng)只要提供所有VNDK版本的二進(jìn)制文件,就可以滿(mǎn)足供應(yīng)商的開(kāi)發(fā)。這些需求的文件就是VNDK快照需要提供的內(nèi)容。
VNDK 快照包含以下文件:
VNDK-core 和 VNDK-SP 共享庫(kù)的供應(yīng)商變體。
- 無(wú)需 LL-NDK 共享庫(kù),因?yàn)檫@類(lèi)庫(kù)是向后兼容的。
- 對(duì)于 64 位目標(biāo),TARGET_ARCH 和 TARGET_2ND_ARCH 庫(kù)都將被編譯并包含在內(nèi)。
- VNDK-core、VNDK-SP、LL-NDK 和 VNDK-private 庫(kù)的列表,文件為
[vndkcore|vndksp|llndk|vndkprivate].libraries.txt。 - 鏈接器配置文件為
ld.config.txt。 - 許可文件。
module_paths.txt。記錄所有 VNDK 庫(kù)的模塊路徑;檢查 GPL 項(xiàng)目是否已在指定 Android 源代碼樹(shù)中發(fā)布源代碼時(shí),需要用到這種文件。
以下示例展示了 arm64 (TARGET_ARCH=arm64) VNDK 快照 ZIP 文件 (android-vndk-arm64.zip) 的目錄結(jié)構(gòu)。

供應(yīng)商鏡像會(huì)依賴(lài)于特定版本的VNDK,所以系統(tǒng)鏡像中應(yīng)該提供供應(yīng)商需求的VNDK版本的鏡像。即使系統(tǒng)鏡像與供應(yīng)商鏡像使用不同版本的Android進(jìn)行編譯,但是只要保證系統(tǒng)鏡像能夠提供正確的VNDK就保證正常運(yùn)行。下圖展示了Android P系統(tǒng)鏡像使用Android O供應(yīng)商鏡像的場(chǎng)景。

啟用 VNDK
編譯選項(xiàng)
在 BoardConfig.mk添加BOARD_VNDK_VERSION=current可以在編譯過(guò)程開(kāi)啟VNDK。也可以在編譯模塊時(shí)傳遞該編譯選項(xiàng),例如: m -j BOARD_VNDK_VERSION=current MY-LIB)。
當(dāng)啟用 BOARD_VNDK_VERSION=current 后,編譯系統(tǒng)會(huì)檢查庫(kù)的依賴(lài)性和頭文件的合法性。
- 確保vendor對(duì)象僅依賴(lài)于VNDK庫(kù)集:VNDK-core、VNDK-SP 和 LL-NDK。確保core組件不依賴(lài)與vendor組件。
- 移除全局頭文件的依賴(lài)項(xiàng),以便編譯器可以明確是否使用
-D__ANDROID_VNDK__來(lái)編譯頭文件。就是說(shuō)全局頭文件無(wú)法再使用傳遞方式包含在頭文件內(nèi)。
啟用 BOARD_VNDK_VERSION后,系統(tǒng)會(huì)移除多個(gè)默認(rèn)的全局頭文件搜索路徑。模塊使用這些路徑下的頭文件時(shí),需要明確指定與 header_libs、static_libs 和/或 shared_libs 的依賴(lài)關(guān)系。這些路徑中包括:
frameworks/av/includeframeworks/native/includeframeworks/native/opengl/includehardware/libhardware/includehardware/libhardware_legacy/includehardware/ril/includelibnativehelper/includelibnativehelper/include_deprecatedsystem/core/includesystem/media/audio/include
供應(yīng)商變體庫(kù)
在 Android.bp 文件中,cc_library、cc_library_static、cc_library_shared 和 cc_library_headers 模塊定義支持三個(gè)與 VNDK 相關(guān)的屬性:vendor_available、vndk.enabled 和 vndk.support_system_process。
如果 一個(gè)庫(kù)標(biāo)記為vendor_available 或 vndk.enabled 為 true,則可能被編譯兩次,生成兩種變體:核心變體和供應(yīng)商變體。
- 核心變體被視為Framework模塊,將安裝到
/system/lib[64]中。 - 而供應(yīng)商變體應(yīng)被視為供應(yīng)商模塊。系統(tǒng)根據(jù)模塊依賴(lài)性來(lái)決定是否編譯變體,并進(jìn)行依賴(lài)性檢查。供應(yīng)商變體安裝路徑會(huì)根據(jù)
Android.bp中的屬性來(lái)決定。
下表總結(jié)了編譯系統(tǒng)如何處理供應(yīng)商變體,
| vendor_available | vndk .enabled | vndk. support_system_process | 供應(yīng)商變體說(shuō)明 |
|---|---|---|---|
| true | false | false | 供應(yīng)商變體為 VND-ONLY。共享庫(kù)將安裝到 /vendor/lib[64] 中。 |
| true | false | true | 無(wú)效(編譯錯(cuò)誤) |
| true | true | false | 供應(yīng)商變體為 VNDK。共享庫(kù)將安裝到 /system/lib[64]/vndk-${VER} 中。 |
| true | true | true | 供應(yīng)商變體為 VNDK-SP。共享庫(kù)將安裝到 /system/lib[64]/vndk-sp-${VER} 中。 |
| false | false | false | 沒(méi)有供應(yīng)商變體。此模塊為 FWK-ONLY。 |
| false | false | true | 無(wú)效(編譯錯(cuò)誤) |
| false | true | false | 供應(yīng)商變體為 VNDK-Private。共享庫(kù)將安裝到 /system/lib[64]/vndk-${VER} 中。供應(yīng)商模塊不得直接使用這些變體。 |
| false | true | true | 供應(yīng)商變體為 VNDK-SP-Private。共享庫(kù)將安裝到 /system/lib[64]/vndk-sp-${VER} 中。供應(yīng)商模塊不得直接使用這些變體。 |
注意:供應(yīng)商可以為其模塊設(shè)置 vendor_available,但不得設(shè)置 vndk.enabled 和 vndk.support_system_process,因?yàn)楣?yīng)商模塊無(wú)法在通用系統(tǒng)映像 (GSI) 中找到它們。
條件編譯
默認(rèn)情況下,Android 編譯系統(tǒng)會(huì)為供應(yīng)商變體和 VNDK 擴(kuò)展定義 __ANDROID_VNDK__。您可以使用 C 預(yù)處理器防護(hù)程序保護(hù)代碼:
void all() { }
#if !defined(__ANDROID_VNDK__)
void framework_only() { }
#endif
#if defined(__ANDROID_VNDK__)
void vndk_only() { }
#endif除了 __ANDROID_VNDK__,還可以在 Android.bp 中指定不同的 cflags 或 cppflags。在 target.vendor 中指定的 cflags 或 cppflags 是專(zhuān)門(mén)針對(duì)供應(yīng)商變體的。
例如,以下 Android.bp 定義了 libexample 和 libexample_ext。它為libexample的供應(yīng)商變體定義了"LIBEXAMPLE_ENABLE_VNDK=1",為libexample的擴(kuò)展庫(kù)定義了 "LIBEXAMPLE_ENABLE_VNDK=1" 和"LIBEXAMPLE_ENABLE_VNDK_EXT=1"。
cc_library {
name: "libexample",
srcs: ["src/example.c"],
vendor_available: true,
vndk: {
enabled: true,
},
target: {
vendor: {
cflags: ["-DLIBEXAMPLE_ENABLE_VNDK=1"],
},
},
}
cc_library {
name: "libexample_ext",
srcs: ["src/example.c"],
vendor: true,
vndk: {
enabled: true,
extends: "libexample",
},
cflags: [
"-DLIBEXAMPLE_ENABLE_VNDK=1",
"-DLIBEXAMPLE_ENABLE_VNDK_EXT=1",
],
}VNDK 擴(kuò)展
Android還提供了VNDK擴(kuò)展的方法,就是使用自己修改的VNDK共享庫(kù)來(lái)替換原始的VNDK共享庫(kù)。因?yàn)楣?yīng)商很可能根據(jù)自己的需求來(lái)更改AOSP庫(kù)的源碼,可能是為了提高性能,或者添加新鉤子、新 API 或新功能。VNDK 擴(kuò)展庫(kù)會(huì)安裝到 /vendor/lib[64]/vndk[-sp] 中,并在系統(tǒng)運(yùn)行時(shí)會(huì)替換原始的 VNDK 共享庫(kù)。
在 Android 9 及更高版本中,Android.bp 本身支持 VNDK 擴(kuò)展。要編譯 VNDK 擴(kuò)展,請(qǐng)定義另一個(gè)具有 vendor:true 和 extends 屬性的模塊:
cc_library {
name: "libvndk",
vendor_available: true,
vndk: {
enabled: true,
},
}
cc_library {
name: "libvndk_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk",
},
}具有 vendor:true、vndk.enabled:true 和 extends 屬性的模塊可定義 VNDK 擴(kuò)展:
extends屬性必須指定基礎(chǔ) VNDK 共享庫(kù)名稱(chēng)(或 VNDK-SP 共享庫(kù)名稱(chēng))。- VNDK 擴(kuò)展(或 VNDK-SP 擴(kuò)展)以擴(kuò)展時(shí)所基于的基礎(chǔ)模塊名稱(chēng)命名。例如,
libvndk_ext的輸出二進(jìn)制文件是libvndk.so,而非libvndk_ext.so。 - VNDK 擴(kuò)展將安裝到
/vendor/lib[64]/vndk中。 - VNDK-SP 擴(kuò)展將安裝到
/vendor/lib[64]/vndk-sp中。 - 基礎(chǔ)共享庫(kù)必須同時(shí)具有
vndk.enabled:true和vendor_available:true。
VNDK-SP 擴(kuò)展必須從 VNDK-SP 共享庫(kù)進(jìn)行擴(kuò)展,就是說(shuō)在定義時(shí)必須包含相同的vndk.support_system_process 。VNDK 擴(kuò)展(或 VNDK-SP 擴(kuò)展)也可以依賴(lài)于其他供應(yīng)商共享庫(kù):
cc_library {
name: "libvndk_sp",
vendor_available: true,
vndk: {
enabled: true,
support_system_process: true,
},
}
cc_library {
name: "libvndk_sp_ext",
vendor: true,
vndk: {
enabled: true,
extends: "libvndk_sp",
support_system_process: true,
shared_libs: [
"libvendor",
],
}
cc_library {
name: "libvendor",
vendor: true,
}如果供應(yīng)商模塊依賴(lài)于由 VNDK 擴(kuò)展定義的其他 API,則該模塊必須在其 shared_libs 屬性中指定 VNDK 擴(kuò)展的名稱(chēng):
// A vendor shared library example
cc_library {
name: "libvendor",
vendor: true,
shared_libs: [
"libvndk_ext",
],
}
// A vendor executable example
cc_binary {
name: "vendor-example",
vendor: true,
shared_libs: [
"libvndk_ext",
],
}如果供應(yīng)商模塊依賴(lài)于 VNDK 擴(kuò)展,則這些 VNDK 擴(kuò)展將自動(dòng)安裝到 /vendor/lib[64]/vndk[-sp] 中。如果某個(gè)模塊不再依賴(lài)于 VNDK 擴(kuò)展,請(qǐng)向 CleanSpec.mk 添加一個(gè)清理步驟,以移除共享庫(kù)。例如:
$(call add-clean-step, rm -rf $(TARGET_OUT_VENDOR)/lib/libvndk.so)
規(guī)則和Sepolicy
VNDK 規(guī)則
完整的 VNDK 規(guī)則列表如下。
- 框架進(jìn)程不得從供應(yīng)商分區(qū)中加載非 SP-HAL 共享庫(kù)(此規(guī)則從 Android 8.1 開(kāi)始嚴(yán)格地強(qiáng)制實(shí)施)。
- 供應(yīng)商進(jìn)程不得從系統(tǒng)分區(qū)中加載非 LL-NDK 庫(kù)、非 VNDK-SP 庫(kù)和非 VNDK 庫(kù)(Android O 中并未嚴(yán)格地強(qiáng)制實(shí)施此規(guī)則,但未來(lái)版本中會(huì)這么做)。
- 注意:要想從未來(lái)版本(比 Android 8.0 更高的版本)僅針對(duì)框架的 OTA 中受益,就不得在搭載 Android 8.0 出廠(chǎng)的設(shè)備中違反此規(guī)則。
- 已安裝的 VNDK 庫(kù)必須是由 Google 定義的合格 VNDK 庫(kù)的子集。
SP-HAL 和 SP-HAL-Dep 的外部依賴(lài)項(xiàng)必須僅限于 LL-NDK 庫(kù)或由 Google 定義的 VNDK-SP 庫(kù)。
- SP-HAL 共享庫(kù)的依賴(lài)項(xiàng)必須僅限于 LL-NDK 庫(kù)、由 Google 定義的 VNDK-SP 庫(kù)、其他 SP-HAL 庫(kù)和/或可標(biāo)記為 SP-HAL-Dep 庫(kù)的其他供應(yīng)商共享庫(kù)。
- 只有當(dāng)供應(yīng)商共享庫(kù)不是 AOSP 庫(kù),且其依賴(lài)項(xiàng)僅限于 LL-NDK 庫(kù)、由 Google 定義的 VNDK-SP 庫(kù)、SP-HAL 庫(kù)和/或其他 SP-HAL-Dep 庫(kù)時(shí),才可標(biāo)記為 SP-HAL-Dep 庫(kù)。
- VNDK-SP 必須保持獨(dú)立。在 Android 8.0 中,系統(tǒng)以一種特殊方式處理
libRS_internal.so,但在未來(lái)版本中,其處理方式會(huì)被重新考慮。 - 不得通過(guò)非 HIDL 接口(包括但不限于 Binder、套接字、共享內(nèi)存、文件等)進(jìn)行框架-供應(yīng)商通信。
- 系統(tǒng)分區(qū)必須足夠大,以便容納所有符合條件的 VNDK 庫(kù)的兩個(gè)副本,以及不符合條件的框架共享庫(kù)的一個(gè)副本。
sepolicy
本部分中介紹的框架進(jìn)程對(duì)應(yīng)于 sepolicy 中的 coredomain,而供應(yīng)商進(jìn)程對(duì)應(yīng)于 non-coredomain。例如,/dev/binder 只能在 coredomain 中被訪(fǎng)問(wèn),而 /dev/vndbinder 只能在非 coredomain 中被訪(fǎng)問(wèn)。
類(lèi)似政策會(huì)限制對(duì)系統(tǒng)分區(qū)和供應(yīng)商分區(qū)上的共享庫(kù)的訪(fǎng)問(wèn)。下表列出了訪(fǎng)問(wèn)不同類(lèi)別的共享庫(kù)時(shí)所需的權(quán)限:
| 類(lèi)別 | 分區(qū) | 是否可從 coredomain 訪(fǎng)問(wèn) | 是否可從 非 coredomain 訪(fǎng)問(wèn) |
|---|---|---|---|
| LL-NDK | 系統(tǒng) | 是 | 是 |
| LL-NDK-Private | 系統(tǒng) | 是 | 是 |
| VNDK-SP/VNDK-SP-Private | 系統(tǒng) | 是 | 是 |
| VNDK-SP-Ext | 供應(yīng)商 | 是 | 是 |
| VNDK | 系統(tǒng) | 是 | 是 |
| VNDK-Ext | 供應(yīng)商 | 否 | 是 |
| FWK-ONLY | 系統(tǒng) | 是 | 否 |
| FWK-ONLY-RS | 系統(tǒng) | 是 | 否 |
| SP-HAL | 供應(yīng)商 | 是 | 是 |
| SP-HAL-Dep | 供應(yīng)商 | 是 | 是 |
| VND-ONLY | 供應(yīng)商 | 否 | 是 |
LL-NDK-Private 和 VNDK-SP-Private 必須從這兩個(gè)域中都可訪(fǎng)問(wèn),因?yàn)榉?nbsp;coredomain 會(huì)間接訪(fǎng)問(wèn)這些庫(kù)。同樣,SP-HAL-Dep 必須可從 coredomain 訪(fǎng)問(wèn),因?yàn)?SP-HAL 依賴(lài)該域。
same_process_hal_file 標(biāo)簽
供應(yīng)商分區(qū)中包含下面幾個(gè)庫(kù)。確保這些庫(kù)既可以從 coredomain 訪(fǎng)問(wèn),又可以從非 coredomain 訪(fǎng)問(wèn)。
- VNDK-SP-Ext,位于
/vendor/lib[64]/vndk-sp - SP-HAL,位于
/vendor/lib[64]或/vendor/lib[64]/hw - SP-HAL-Dep,位于
/vendor/lib[64]或/vendor/lib[64]/hw
將這些文件明確標(biāo)記為 same_process_hal_file。因?yàn)樵谀J(rèn)情況下,從 coredomain 無(wú)法訪(fǎng)問(wèn) vendor 分區(qū)中的任何內(nèi)容。請(qǐng)向供應(yīng)商特定的 file_contexts 文件中添加與以下命令行類(lèi)似的命令行:
/vendor/lib(64)?/hw/libMySpHal\.so u:object_r:same_process_hal_file:s0 /vendor/lib(64)?/vndk-sp/libBase\.so u:object_r:same_process_hal_file:s0 /vendor/lib(64)?/libBaseInternal\.so u:object_r:same_process_hal_file:s0
參考文檔:
以上就是Android VNDK使用及原理深入探究的詳細(xì)內(nèi)容,更多關(guān)于Android VNDK使用原理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)延遲的幾種方法小結(jié)
這篇文章主要介紹了Android實(shí)現(xiàn)延遲的幾種方法,結(jié)合實(shí)例總結(jié)了Android實(shí)現(xiàn)延遲的幾種常見(jiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02
Android開(kāi)發(fā)手冊(cè)TextView屬性實(shí)現(xiàn)效果盤(pán)點(diǎn)
這篇文章主要為大家介紹了Android開(kāi)發(fā)手冊(cè)TextView屬性實(shí)現(xiàn)的效果盤(pán)點(diǎn)及使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Android自定義View實(shí)現(xiàn)簡(jiǎn)單炫酷的球體進(jìn)度球?qū)嵗a
這篇文章主要給大家介紹了關(guān)于Android自定義View實(shí)現(xiàn)簡(jiǎn)單炫酷的球體進(jìn)度球的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
小心!Listview結(jié)合EditText使用實(shí)例中遇到的那些坑
小心!Listview結(jié)合EditText使用實(shí)例中遇到的那些坑,解決EditText焦點(diǎn)丟失、保存數(shù)據(jù)以及滾動(dòng)沖突的問(wèn)題,感興趣的小伙伴們可以參考一下2016-06-06
Android SQLite數(shù)據(jù)庫(kù)操作代碼類(lèi)分享
這篇文章主要介紹了Android SQLite數(shù)據(jù)庫(kù)操作代碼類(lèi)分享,本文直接給出實(shí)現(xiàn)代碼和使用代碼,需要的朋友可以參考下2015-03-03
Android自定義View實(shí)現(xiàn)簡(jiǎn)易畫(huà)板功能
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)簡(jiǎn)易畫(huà)板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
分享Android 藍(lán)牙4.0(ble)開(kāi)發(fā)的解決方案
這篇文章主要為大家分享了Android 藍(lán)牙4.0(ble)開(kāi)發(fā)的解決方案,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
Android實(shí)現(xiàn)日夜間模式的深入理解
相信Android的日間/夜間模式切換相信大家在平時(shí)使用 APP 的過(guò)程中都遇到過(guò),比如知乎、簡(jiǎn)書(shū)中就有相關(guān)的模式切換。實(shí)現(xiàn)日間/夜間模式切換的方案也有許多種,趁著今天有空來(lái)講一下日間/夜間模式切換的幾種實(shí)現(xiàn)方案,也可以做一個(gè)橫向的對(duì)比來(lái)看看哪種方案最好。2016-09-09

