VNDK 快照設計

系統映像檔可使用 VNDK 快照,為供應商映像檔提供正確的 VNDK 程式庫,即使系統和供應商映像檔是使用不同版本的 Android 建構,也一樣適用。建立 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 快照的連結器命名空間設定檔安裝至 /etc 目錄。/system/lib[64]/vndk-sp-${VER}

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。