VNDK 快照設計

即使系統和供應商映像是從不同版本的 Android 建立的,系統映像也可以使用 VNDK 快照為供應商映像提供正確的 VNDK 庫。建立 VNDK 快照需要捕獲 VNDK 庫作為快照並用版本號標記它們。供應商映像可以與特定的 VNDK 版本鏈接,該版本為供應商映像中的模組提供所需的 ABI。但是,在同一 VNDK 版本中,VNDK 函式庫必須是ABI 穩定的

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,
},

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} (供應商可以使用的目錄)分區),其中${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 9 系統映像一起提供與 Android 8.1 供應商映像相符的 VNDK 快照,如下所示:

圖 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快照的/system/lib[64]/vndk-sp-${VER}目錄和連結器命名空間設定檔儲存到/etc目錄。

VNDK 版本控制

每個 Android 版本只有一個 VNDK 快照,而 SDK 版本用作 VNDK 版本(這表示 VNDK 版本具有整數,例如 Android 8.1 為 27)。 Android 版本發佈時,VNDK 版本已修復。供應商分區使用的 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。