供應商原生開發工具包 (VNDK)

供應商本機開發工具包 (VNDK) 是一組專供供應商實現其 HAL 的庫。該VNDK船舶system.img和動態鏈接到供應商代碼在運行時。

為什麼是 VNDK?

Android 8.0 及更高版本支持僅框架更新,其中系統分區可以升級到最新版本,而供應商分區保持不變。這意味著在不同時間構建的二進製文件必須能夠相互協作; VNDK 涵蓋了跨 Android 版本的 API/ABI 更改。

僅框架更新包括以下挑戰:

  • 框架模塊和供應商模塊之間的依賴性。在 Android 8.0 之前,雙方的模塊可以與對方的模塊鏈接。然而,來自供應商模塊的依賴性對框架模塊的開發施加了不希望的限制。
  • 擴展到AOSP庫。 Android 8.0 及更高版本要求所有 Android 設備在系統分區替換為標准通用系統映像 (GSI) 時通過 CTS。但是,隨著供應商擴展 AOSP 庫以提高性能或為其 HIDL 實現添加額外功能,使用標準 GSI 刷新系統分區可能會破壞供應商的 HIDL 實現。 (有關指引,防止這種破損,看到VNDK擴展。)

為了應對這些挑戰,機器人8.0介紹了幾種技術,例如VNDK(在本節中描述), HIDL ,hwbinder,設備樹覆蓋,和sepolicy覆蓋。

VNDK 資源

本節包括以下 VNDK 資源:

  • VNDK概念(下文)描述框架共享庫,同過程HALS(SP-HALS),和VNDK術語。
  • VNDK擴展進行分類供應商特定變成類別。例如,供應商模塊所依賴的具有擴展功能的庫必須複製到供應商分區中,但禁止與 ABI 不兼容的更改。
  • VNDK構建系統支持描述構建系統的配置和使用有關VNDK模塊定義的語法。
  • VNDK定義工具幫助遷移的源代碼樹到Android 8.0及更高版本。
  • 接頭命名空間提供了共享庫聯繫細粒度控制。
  • 目錄,規則和sepolicy定義的目錄結構為運行Android 8.0和更高,VNDK規則的設備,和相關聯的sepolicy。
  • VNDK設計演示說明了Android的8.0和更高的使用基本VDNK概念。

VNDK 概念

在理想的 Android 8.0 及更高版本中,框架進程不加載供應商共享庫,所有供應商進程僅加載供應商共享庫(以及部分框架共享庫),並且框架進程和供應商進程之間的通信由 HIDL 和硬件管理粘合劑。

在這樣的情況下,來自框架共享庫的穩定的公共 API 可能不足以滿足供應商模塊開發人員的需求(儘管 API 可以在 Android 版本之間更改),要求供應商進程可以訪問框架共享庫的某些部分。此外,由於性能要求可能會導致妥協,因此必須區別對待某些響應時間關鍵的 HAL。

以下部分詳細介紹了 VNDK 如何處理供應商和同進程 HAL (SP-HAL) 的框架共享庫。

供應商的框架共享庫

本節描述了對供應商進程可訪問的共享庫進行分類的標準。有兩種方法可以跨多個 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)框架共享庫是安全的,被複製兩次。框架模塊廠商模塊可以用自己的副本鏈接。框架共享庫只有滿足以下條件才能成為合格的 VNDK 庫:
    • 它不會向/從框架發送/接收 IPC。
    • 它與 ART 虛擬機無關。
    • 它不會讀/寫文件格式不穩定的文件/分區。
    • 它沒有需要法律審查的特殊軟件許可證。
    • 其代碼所有者對供應商的使用沒有異議。
  • 框架,只有庫(FWK-ONLY)是上面提及的那些不屬於該類別的框架共享庫。這些庫:
    • 被認為是框架內部的實現細節。
    • 供應商模塊不得訪問。
    • 具有不穩定的 ABI/API 並且沒有 API/ABI 兼容性保證。
    • 不是複制的。

同進程 HAL (SP-HAL)

同一進程HAL(SP-HAL)是一組作為賣方共享庫實現,並裝入框架進程預定的HAL的。 SP-HAL 由鏈接器命名空間隔離(控制對共享庫可見的庫和符號)。 SP-HALS必須在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文件。如果vendor_available: false還規定,那麼這些庫被稱為VNDK-SP-私人和他們是不可見的SP-HALS。

以下是與RS例外(FWK-ONLY-RS)僅框架的庫

  • libft2.so (的renderScript)
  • libmediandk.so (的renderScript)

VNDK 術語

  • 模塊共享庫可執行文件
  • 進程運行可執行文件催生的系統任務。
  • 框架-qualified術語指的是涉及到系統分區的概念。
  • 供應商-qualified術語指的是與供應商分區的概念。

例如:

  • 框架可執行文件指的是可執行文件/system/bin/system/xbin
  • 框架共享庫指共享庫下/system/lib[64]
  • 框架模塊是指兩個框架共享庫框架可執行文件
  • 框架的進程是從框架可執行(例如產生的進程/system/bin/app_process )。
  • 賣方可執行指的可執行/vendor/bin
  • 供應商共享庫指共享庫下/vendor/lib[64]
  • 廠商模塊指兩種賣方可執行供應商共享庫
  • 供應商的流程是從供應商可執行產生的進程(例如
  • /vendor/bin/android.hardware.camera.provider@2.4-service )。

VNDK 版本控制

在 Android 9 中,對 VNDK 共享庫進行了版本控制:

  • ro.vndk.version系統屬性被自動添加到/vendor/default.prop
  • VNDK共享庫安裝到/system/lib[64]/vndk-${ro.vndk.version}
  • VNDK-SP共享庫安裝到/system/lib[64]/vndk-sp-${ro.vndk.version}
  • 動態鏈接程序配置文件安裝到/system/etc/ld.config.${ro.vndk.version}.txt

的值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 )。

升級設備

如果一個Android設備8.x中禁用VNDK運行時執行而不建BOARD_VNDK_VERSION ,它可能會增加PRODUCT_USE_VNDK_OVERRIDE := falseBoardConfig.mk同時升級到Android 9。

如果PRODUCT_USE_VNDK_OVERRIDEfalse ,在ro.vndk.lite屬性將被自動添加到/vendor/default.prop ,其價值將是true 。因此,動態鏈接程序將加載從連接體命名空間配置/system/etc/ld.config.vndk_lite.txt ,其只隔離SP-HAL和VNDK-SP。

到Android 7.0或更低設備升級至Android 9,添加PRODUCT_TREBLE_LINKER_NAMESPACES_OVERRIDE := falseBoardConfig.mk

供應商測試套件 (VTS)

在Android 9賣方測試套件(VTS)的任務的非空ro.vndk.version屬性。這兩種新推出的設備和升級設備必須定義ro.vndk.version 。有些VNDK測試用例(如VtsVndkFilesTestVtsVndkDependencyTest )依靠ro.vndk.version財產加載匹配資格VNDK庫的數據集。

如果ro.product.first_api_level屬性大於27,則ro.vndk.lite屬性不能被定義。 VtsTreblePlatformVersionTest如果將失敗ro.vndk.lite是在新推出的Android設備9定義。

文檔歷史

本節跟踪 VNDK 文檔的更改。

Android 9 變化

  • 添加 VNDK 版本控制部分。
  • 添加 VTS 部分。
  • 一些 VNDK 類別已重命名:
    • LL-NDK-Indirect 已重命名為 LL-NDK-Private。
    • VNDK-Indirect 已重命名為 VNDK-Private。
    • VNDK-SP-Indirect-Private 已重命名為 VNDK-SP-Private。
    • VNDK-SP-Indirect 已被刪除。

Android 8.1 變化

  • SP-NDK 庫已合併到 LL-NDK 庫中。
  • 更換libui.solibft2.so在RS命名空間部分。這是包括錯誤libui.so
  • 添加libGLESv3.solibandroid_net.so到LL-NDK庫。
  • 添加libion.so到VNDK-SP庫。
  • 除去libstdc++.so從LL-NDK庫。使用libc++.so吧。獨立的工具鏈的某些版本可能會增加-lstdc++到默認連接標誌。要禁用默認值,添加-nodefaultlibs -lc -lm -ldlLDFLAGS
  • 移動libz.so從LL-NDK到VNDK-SP庫。在一些配置中, libz.so可以繼續為LL-NDK。但是,應該沒有可觀察到的差異。