Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

供應商本地開發套件(VNDK)

供應商本地開發工具包(VNDK)是一組專門供供應商用來實現其HAL的庫。 VNDK隨附在system.img並在運行時動態鏈接到供應商代碼。

為什麼選擇VNDK?

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

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

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

為了應對這些挑戰,Android 8.0引入了多種技術,例如VNDK(在本節中介紹), HIDL ,hwbinder, 設備樹覆蓋和Sepolicy覆蓋。

VNDK資源

本節包括以下VNDK資源:

  • VNDK概念 (下文)描述了框架共享庫,同進程HAL(SP-HAL)和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如何處理供應商和Same-Process 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或從框架接收IPC。
    • 它與ART虛擬機無關。
    • 它不會讀取/寫入具有不穩定文件格式的文件/分區。
    • 它沒有需要法律審查的特殊軟件許可證。
    • 它的代碼所有者不反對供應商的用法。
  • 僅框架庫(僅FWK)是不屬於上述類別的框架共享庫 。這些庫:
    • 被認為是框架內部的實現細節。
    • 不得由供應商模塊訪問。
    • 具有不穩定的ABI / API,並且沒有API / ABI兼容性保證。
    • 不被複製。

同進程HAL(SP-HAL)

Same-Process HALSP-HAL )是一組實現為供應商共享庫並加載到Framework Processs中的預定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庫在其Android.bp文件中指定vndk: { support_system_process: true } 。如果還指定了vendor_available: false ,則這些庫稱為VNDK-SP-Private ,它們對SP-HALS不可見。

以下是具有RS異常(FWK-ONLY-RS)的僅框架庫

  • libft2.so (渲染腳本)
  • libmediandk.so (渲染腳本)

VNDK術語

  • 模塊指的是共享庫可執行文件
  • 進程是從可執行文件產生的操作系統任務。
  • 框架限定的術語是指與系統分區有關的概念。
  • 供應商限定術語是指與供應商分區有關的概念。

例如:

  • 框架可執行文件是指/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設備通過在沒有BOARD_VNDK_VERSION情況下進行構建而禁用了VNDK運行時實施,則在升級到Android 9時,可能會將PRODUCT_USE_VNDK_OVERRIDE := false添加到BoardConfig.mk

如果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 := false添加到BoardConfig.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屬性。如果在新推出的Android 9設備中定義了ro.vndk.liteVtsTreblePlatformVersionTest將失敗。

文件紀錄

本節跟踪對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庫中。
  • 在RS名稱空間部分中,將libui.so替換為libft2.so 。包含libui.so是錯誤的。
  • libGLESv3.solibandroid_net.so添加到LL-NDK庫。
  • libion.so添加到VNDK-SP庫。
  • 從LL-NDK庫中刪除libstdc++.so 。請改用libc++.so 。某些版本的獨立工具鏈可能會將-lstdc++添加到默認鏈接器標誌。要禁用默認值,請將-nodefaultlibs -lc -lm -ldl添加到LDFLAGS
  • libz.so從LL-NDK移到VNDK-SP庫。在某些配置中, libz.so可能繼續是LL-NDK。但是,應該沒有明顯的差異。