VNDK 快照設計

即使系統和供應商映像是從不同版本的 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 庫。

圖 1.僅升級系統

示例:升級系統映像,較小的供應商映像更改

尚不支持針對 VNDK 快照構建供應商映像,因此您必須使用其原始源代碼單獨構建供應商映像,然後按照前面示例中的說明昇級系統映像。

VNDK 快照架構

為了使 Android 9 系統鏡像與 Android 8.1 供應商鏡像兼容,與 Android 8.1 供應商鏡像匹配的 VNDK 快照必須與 Android 9 系統鏡像一起提供,如下所示:

圖 2. VNDK 快照架構

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。