VNDK 快照設計

系統映像檔可使用 VNDK 快照,為供應商映像檔提供正確的 VNDK 程式庫,即使系統和供應商映像檔是使用不同版本的 Android 建構,也能提供正確的 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-core

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 將至少包含一個 VNDK-core 快照,以及 Android 原始碼中舊版的 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 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 是 Android 9 的 VNDK 版本。快照也包含連結器命名空間設定檔 /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},並將這些 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 程式庫並未穩定。不過,當 Android 版本發布時,目前 VNDK 版本的 ABI 會固定。此時,任何 ABI 損壞都是建構錯誤,因此 Android 版本的修補程式不得變更 VNDK 程式庫的 ABI。