即使系統和供應商映像是從不同版本的 Android 構建的,系統映像也可以使用 VNDK 快照為供應商映像提供正確的 VNDK 庫。創建 VNDK 快照需要將 VNDK 庫捕獲為快照並用版本號標記它們。供應商映像可能與特定 VNDK 版本鏈接,該版本為供應商映像中的模塊提供所需的 ABI。但是,在同一 VNDK 版本中,VNDK 庫必須是ABI-stable 。
VNDK 快照設計包括從當前系統映像生成 VNDK 快照的預構建並將這些預構建庫安裝到較新 Android 版本的系統分區的方法。
關於 VNDK 庫
Android 8.0 中引入的HIDL-HAL支持對系統和供應商分區進行單獨升級。 VNDK 定義了供應商代碼可以鏈接的庫集(VNDK-core、VNDK-SP 和 LL-NDK),並阻止供應商使用不在 VNDK 集中的庫。因此,如果將系統映像上的正確 VNDK 集提供給供應商映像,則可以構建和運行供應商映像。
VNDK-核心
VNDK 核心庫集安裝在/system/lib[64]/vndk-${VER}
中,僅適用於 API 級別等於${VER}
的供應商進程。系統進程可能不使用這些庫,而必須使用安裝在/system/lib[64]
中的庫。由於每個進程都有嚴格的命名空間限制,VNDK 核心庫可以避免雙重加載。
要在 VNDK-core 中包含一個庫,請將以下內容添加到Android.bp
:
vendor_available: true, vndk: { enabled: true, },
VNDK-SP
VNDK-SP 庫安裝在/system/lib[64]/vndk-sp-${VER}
中,可供供應商進程和系統進程使用(通過安裝在供應商分區中的 SP-HAL 庫)。 VNDK-SP 庫可能是雙重加載的。
要在 VNDK-SP 中包含庫,請將以下內容添加到Android.bp
:
vendor_available: true, vndk: { enabled: true, support_system_process: true, },
LL-NDK
LL-NDK 庫安裝在/system/lib[64]
中。供應商模塊可以使用 LL-NDK 存根庫來訪問 LL-NDK 庫的預選符號。 LL-NDK 庫必須向後兼容且 ABI 穩定,以使舊版本的供應商模塊能夠使用新版本的 LL-NDK 庫。由於 LL-NDK 的 ABI 穩定特性,VNDK 快照不需要包含舊供應商映像的 LL-NDK 庫。
關於 VNDK 快照
Android 8.1 包含從源代碼構建的 VNDK 庫。但是,對於更高版本的 Android,必須將每個 VNDK 版本捕獲為快照並作為預構建提供,以啟用與舊供應商映像的鏈接。
從 Android 9 開始,新版本的 Android 將在 Android 源代碼中包含至少一個舊版本的 VNDK-core 和 VNDK-SP 目錄快照。在構建時,所需的快照將安裝到/system/lib[64]/vndk-${VER}
和/system/lib[64]/vndk-sp-${VER}
(供應商可以使用的目錄partition),其中${VER}
是表示 VNDK 快照的版本名稱的字符串變量。
由於每個 VNDK 版本的 VNDK 快照庫可能不同,因此 VNDK 快照還包括鏈接器命名空間配置,安裝為etc/ld.config.${VER}.txt
、 /etc/llndk.libraries.${VER}.txt
, 和/etc/vndksp.libraries.${VER}.txt
。
示例:升級系統和供應商映像
不需要快照;無需額外配置 VNDK 快照即可構建。
示例:僅升級系統映像
必須在系統映像中包含供應商映像的 VNDK 快照和鏈接器命名空間配置文件。鏈接器命名空間配置文件自動配置為在/system/lib[64]/vndk-${VER}
和/system/lib[64]/vndk-sp-${VER}
中搜索 VNDK 庫。
示例:升級系統映像,較小的供應商映像更改
尚不支持針對 VNDK 快照構建供應商映像,因此您必須使用其原始源代碼單獨構建供應商映像,然後按照前面示例中的說明昇級系統映像。
VNDK 快照架構
為了使 Android 9 系統鏡像與 Android 8.1 供應商鏡像兼容,與 Android 8.1 供應商鏡像匹配的 VNDK 快照必須與 Android 9 系統鏡像一起提供,如下所示:
VNDK 快照設計包括以下方法:
- 為 VNDK-core 和 VNDK-SP 庫生成快照。 Android 9 包含一個腳本,可用於製作當前 VNDK 構建的快照。此腳本捆綁
/system/lib[64]/vndk-28
和/system/lib[64]/vndk-sp-28
中的所有庫,這些庫是使用當前源構建的 VNDK 快照,其中28
是 VNDK 版本Android 9. 快照還包括鏈接器命名空間配置文件/etc/ld.config.28.txt
、/etc/llndk.libraries.28.txt
和/etc/vndksp.libraries.28.txt
。生成的快照將用於較新的 Android 版本(高於 Android 9)。 - 從快照安裝預構建的 VNDK-core 和 VNDK-SP 庫。在 Android 9 中,VNDK 快照具有一組預構建的 VNDK 核心庫和一組 VNDK-SP 庫,以及鏈接器命名空間配置文件。當您提供要安裝的 VNDK 快照版本列表時,系統映像將 VNDK 快照庫安裝到
/system/lib[64]/vndk-${VER}
和/system/lib[64]/vndk-sp-${VER}
目錄和鏈接器命名空間配置文件,用於將這些 VNDK 快照保存到/etc
目錄。
VNDK 版本控制
每個 Android 版本只有一個 VNDK 快照,SDK 版本用作 VNDK 版本(這意味著 VNDK 版本有一個整數,如 Android 8.1 為 27)。 VNDK 版本在 Android 版本發佈時已修復。供應商分區使用的 VNDK 版本自動存儲在ro.vndk.version
屬性中,可以在運行時讀取。然後,此版本用於識別某些庫的供應商 VNDK 版本並識別命名空間配置的 VNDK 快照版本。
構建 VNDK 庫
make vndk
命令構建具有vndk: { enabled: true, … }
的庫,包括依賴項和命名空間配置文件。如果設置BOARD_VNDK_VERSION := current
,則使用make
命令構建這些庫。
由於此版本不會從快照安裝 VNDK 庫,因此安裝的 VNDK 庫不是 ABI 穩定的。但是,當發布 Android 版本時,當前 VNDK 版本的 ABI 是固定的。此時,任何 ABI 損壞都是構建錯誤,因此 Android 版本的補丁不得更改 VNDK 庫的 ABI。