即使系統和供應商映像是從不同版本的 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 函式庫。
範例:升級系統映像、較小的供應商映像更改
尚不支援針對 VNDK 快照建立供應商映像,因此您必須與其原始原始碼單獨建立供應商映像,然後按照上一範例所述升級系統映像。
VNDK快照架構
為了讓 Android 9 系統映像與 Android 8.1 供應商映像相容,必須與 Android 9 系統映像一起提供與 Android 8.1 供應商映像相符的 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。