供應商原生開發套件 (VNDK) 總覽

Vendor Native Development Kit (VNDK) 是其他程式庫使用的一組程式庫 或二進位檔,以 dlopen 為準。

為什麼要使用 VNDK?

Android 開放原始碼計畫允許僅針對架構更新,允許系統分區升級至最新版本 但供應商分區則保持不變。無論建構在 每個分區中的二進位檔必須能夠互相搭配運作。

僅針對架構的更新包括下列挑戰:

  • 架構模組與供應商模組之間的相依性。 在 Android 8.0 之前,供應商和系統分區中的模組可以連結 應用程式設計然而,來自供應商模組的依附元件並不必要 對架構模組開發的限制。
  • Android 開放原始碼計畫程式庫的擴充功能。Android 版 系統分區更換時,所有 Android 裝置都必須通過 CTS 搭配標準通用系統映像檔 (GSI) 使用不過,因為供應商會擴充 Android 開放原始碼計畫 可提高效能或為 HIDL 新增額外功能的程式庫 並使用標準 GSI 重新整理系統分區 可能會破壞供應商的 HIDL 實作。如需 預防這類故障,詳情請參閱 VNDK 擴充功能

為因應這些挑戰,Android 提供多項功能,例如 做為 VNDK (本節所述), HIDL、hwbinder、 裝置樹狀結構疊加層,以及 sepolicy 疊加層。

VNDK 專屬字詞

VNDK 相關文件使用下列術語:
  • 模組是指共用程式庫或執行檔。模組可縮短建構時間 依附元件
  • 「程序」是指執行檔產生的作業系統工作。程序需要執行 依附元件
  • 架構合格字詞與 system 分區相關:
    • 架構執行檔是指 /system/bin/system/xbin
    • 架構共用程式庫是指下方的共用程式庫: /system/lib[64]
    • 架構模組是指兩個架構共用程式庫 以及架構執行檔
    • 架構程序是從架構產生的程序 執行檔,例如 /system/bin/app_process
  • 供應商資格條款與 vendor 個分區相關:
    • 供應商執行檔是指 /vendor/bin 中的執行檔
    • 供應商共用資料庫」指的是 /vendor/lib[64]
    • 供應商模組是指供應商可執行檔和供應商共用程式庫。
    • 供應商流程是供應商產生的程序 執行檔,例如 /vendor/bin/android.hardware.camera.provider@2.4-service
    ,瞭解如何調查及移除這項存取權。
,瞭解如何調查及移除這項存取權。

VNDK 概念

在理想的 Android 8.0 及以上版本中,架構程序無法載入 供應商共用程式庫,所有供應商程序都只會載入供應商共用程式庫 (和架構共用資料庫的一部分),以及 架構程序和供應商流程均受 HIDL 與硬體的規範 繫結器。

這世界上有可能 架構共用程式庫可能不足以滿足供應商模組開發人員的需求 (雖然 API 可在不同的 Android 版本之間變更),但需要有一部分 的架構共享程式庫此外, 效能需求可能導致系統遭到入侵,有些關鍵回應則在時 HAL 的處理方式必須不同。

以下各節將詳細說明 VNDK 如何處理 廠商和相同程序 HAL (SP-HAL)。

供應商適用的架構共用程式庫

本節說明將共享程式庫分類的條件 才能使用 Cloud SQL 的您可以透過兩種方式支援供應商 多個 Android 版本的模組:

  1. 穩定處理架構共用程式庫的 ABI/API。 新的架構模組和舊的供應商模組可以使用同一個共用資料庫 減少記憶體用量和儲存空間大小獨特的共用資料庫也能避免 會遇到幾個重複載入的問題不過,維持穩定的開發成本 ABI/API 偏高,無法穩定執行以下工具匯出的所有 ABI/API 每個架構的共用資料庫
  2. 複製舊架構共用資料庫。搭載強勁 對側邊頻道的限制,這種通訊機制是指 基準模組和供應商模組,包括但不限於 繫結器、通訊端、管道、共用記憶體、共用檔案和系統屬性。有 必須是零通訊,除非通訊協定凍結且穩定 (例如透過 hwbinder 執行 HIDL)。重複載入共用程式庫可能會 如要解決這類問題舉例來說,如果將新程式庫建立的物件 改為舊程式庫的函式之後,可能會隨著這些程式庫發生錯誤而發生錯誤 可能有不同的解譯方式

根據共用特性,採用不同的方法 程式庫因此,架構共用資料庫可分為三個 子類別:

  • LL-NDK 程式庫架構共用資料庫 而已知的穩定版本開發人員 和 API/ABI 的穩定性。
    • LL-NDK 包含下列程式庫: libEGL.solibGLESv1_CM.solibGLESv2.solibGLESv3.solibandroid_net.solibc.solibdl.soliblog.solibm.solibnativewindow.solibneuralnetworks.solibsync.solibvndksupport.solibvulkan.so
  • 符合資格的 VNDK 程式庫 (VNDK)共用架構 可以安全複製兩次的程式庫Framework Modules廠商單元條款可與自己的副本連結。共用架構 程式庫必須符合下列條件,才能成為符合資格的 VNDK 程式庫 標準:
    • 不會將 IPC 傳送至/傳出架構。
    • 與 ART 虛擬機器無關。
    • 不會讀取/寫入採用不穩定的檔案格式的檔案/分區。
    • 沒有需要法律審查的特殊軟體授權。
    • 程式碼擁有者對供應商使用行為沒有異議。
  • 架構專用程式庫 (僅限 FWK)是以共用架構 不屬於上述類別的程式庫。這些 程式庫:
    • 屬於架構內部實作細節。
    • 不得由供應商模組存取。
    • 具有不穩定的 ABI/API,且不提供 API/ABI 相容性保證。
    • 未複製。

相同程序 HAL (SP-HAL)

Same-Process HAL (SP-HAL) 是一組預先定義的 HAL 以供應商共用資料庫的形式實作,並載入架構 程序。SP-HAL 是由連接器命名空間隔離 (控制 可在共享程式庫中看到的程式庫和符號)。SP-HAL 必須 只有 LL-NDKVNDK-SP

VNDK-SP 是合格 VNDK 程式庫的預先定義子集。VNDK-SP 程式庫 會仔細審核,確保 VNDK-SP 程式庫重複載入至架構 不會造成問題SP-HAL 和 VNDK-SP 都是由 Google。

以下程式庫已獲核准 SP-HAL:

  • libGLESv1_CM_${driver}.so
  • libGLESv2_${driver}.so
  • libGLESv3_${driver}.so
  • libEGL_${driver}.so
  • vulkan.${driver}.so
  • android.hardware.renderscript@1.0-impl.so
  • android.hardware.graphics.mapper@2.0-impl.so

VNDK-SP 程式庫指定 vndk: { support_system_process: true } 將其放在 Android.bp 檔案中如果 vndk: {private:true} 也是 這些程式庫稱為 VNDK-SP-Private 只有 SP-HALS 看不見。

以下為只有架構且 RS 例外狀況的程式庫 (FWK-ONLY-RS)

  • libft2.so (轉譯文字)
  • libmediandk.so (轉譯文字)
,瞭解如何調查及移除這項存取權。

VNDK 版本管理

VNDK 共用程式庫已版本管理:

  • ro.vndk.version 系統屬性會自動新增至 /vendor/default.prop
  • VNDK 和 VNDK-SP 共用程式庫是以 VNDK 外掛程式的形式安裝 com.android.vndk.v${ro.vndk.version} 並掛接至 /apex/com.android.vndk.v${ro.vndk.version}

ro.vndk.version 的值是由演算法選擇 如下:

  • 如果 BOARD_VNDK_VERSION 不等於 current,使用 BOARD_VNDK_VERSION
  • 如果 BOARD_VNDK_VERSION 等於「等於」 current:
    • 如果 PLATFORM_VERSION_CODENAMEREL,請使用 PLATFORM_SDK_VERSION (例如 28)。
    • 否則,請使用 PLATFORM_VERSION_CODENAME (例如 P)。

供應商測試套件 (VTS)

Android 供應商測試套件 (VTS) 規定 ro.vndk.version 屬性並非空白。兩款新上市的裝置 且升級裝置必須定義 ro.vndk.version。部分 VNDK 測試 案件 (例如 VtsVndkFilesTestVtsVndkDependencyTest) 仰賴 ro.vndk.version 屬性載入相符 VNDK 程式庫資料集。