VINTF 物件匯總來自裝置、 資訊清單和架構資訊清單檔案 (XML)。兩者皆有 資訊清單會共用一種格式,但並非所有元素都適用於這兩個元素 (詳情請參閱 請參閱資訊清單檔案結構定義)。
裝置資訊清單
裝置資訊清單 (由裝置提供) 包含供應商資訊清單 和 ODM 資訊清單
- 供應商資訊清單指定了與 SoC 共用的 HAL 和 SELinux 政策版本等。這項服務
建議放在
device/VENDOR/DEVICE/manifest.xml
,但多個片段 檔案。詳情請參閱資訊清單片段和 產生 來自片段的即時訊息。 - ODM 資訊清單會列出
ODM 分區。
VINTF 物件會以下列順序載入 ODM 資訊清單:
- 如果已定義
SKU
(其中SKU
是ro.boot.product.hardware.sku
屬性),/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- 如果已定義
SKU
/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- 如果已定義
- 供應商資訊清單會列出供應商分區中產品的 HAL。
VINTF 物件會以下列順序載入供應商資訊清單:
- 如果已定義
SKU
(其中SKU
是ro.boot.product.vendor.sku
屬性),/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- 如果已定義
- VINTF 物件會以下列順序載入裝置資訊清單:
- 如果供應商資訊清單存在,請合併下列項目:
- 供應商資訊清單
- 選用的供應商資訊清單片段
- 選用的 ODM 資訊清單
- 選用的 ODM 資訊清單片段
- 如果不是的話,請將 ODM 資訊清單與選用的 ODM 結合在一起 資訊清單片段
/vendor/manifest.xml
(舊版,無片段)- 最後,合併來自任何供應商 APEX 的資訊清單片段。
請注意:
- 在舊版裝置上,則會使用舊版供應商資訊清單和 ODM 資訊清單。 ODM 資訊清單可能會完全覆寫舊版供應商資訊清單。
- 在搭載 Android 9 的裝置上,ODM 資訊清單會 與廠商資訊清單連結
- 合併資訊清單清單時,清單稍後顯示的資訊清單可能會覆寫
標記,前提是在稍後
資訊清單具有
override="true"
屬性。舉例來說,ODM 資訊清單可能會 會覆寫供應商資訊清單中的部分<hal>
標記。詳情請參閱 屬性override
。
- 如果供應商資訊清單存在,請合併下列項目:
你可以透過這項設定,讓同一板的多項產品共用相同的 供應商圖片 (提供常見的 HAL) 但具有不同的 ODM 映像檔 例如特定產品的 HAL)。
以下是供應商資訊清單範例。
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
以下是 ODM 資訊清單範例。
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
以下是 OTA 套件中的裝置資訊清單範例。
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
詳情請參閱裝置資訊清單 開發。
架構資訊清單
架構資訊清單檔案包含系統資訊清單、產品資訊清單和 system_ext 資訊清單。
-
系統資訊清單 (由 Google 提供) 是由手動產生
位於以下位置的 Android 原始碼樹狀結構
/system/libhidl/manifest.xml
。 - 產品資訊清單 (由裝置提供) 會列出 產品劃分。
-
system_ext 資訊清單 (由裝置提供) 列出下列資訊:
- 安裝在 system_ext 分區上的模組所提供的 HAL;
- VNDK 版本;
- 系統 SDK 版本。
與裝置資訊清單類似,您可以使用多個片段檔案。詳情請參閱 資訊清單片段。
以下是架構資訊清單範例。
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
資訊清單片段
在 Android 10 以上版本中,您可以為資訊清單建立關聯 具有 HAL 模組的項目。因此您可以更輕鬆地 有條件地在建構系統中納入 HAL 模組。
範例
在 Android.bp
或 Android.mk
檔案中新增
vintf_fragments
附加至任何模組。舉例來說,您可以將
我們將透過您的 HAL 實作這個模組
(my.package.foo@1.0-service-bar
)。
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
在名為 manifest_foo.xml
的檔案中,為
在本單元中在建構期間,此資訊清單會新增至裝置。正在新增
在此項目等同於在裝置的主要資訊清單中新增項目。
讓用戶端可使用介面並允許 VTS 找出哪個 HAL
只在裝置上使用任何一般資訊清單
這個資訊清單也確實了
以下範例採用
android.hardware.foo@1.0::IFoo/default
,安裝位置
vendor
或 odm
分區。如果安裝 ID 是
system
、product
或 system_ext
分區,請使用類型
framework
取代
類型 device
。
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
如果 HAL 模組封裝在供應商 APEX 中,
將相關 VINTF 片段封裝在與 prebuilt_etc
相同的 APEX 中,
相關說明請參閱 VINTF 片段。
資訊清單檔案結構定義
本節說明這些 XML 標記的意義。部分「必要」標籤
可以來自 Android 原始碼樹狀結構的原始碼檔案缺少
assemble_vintf
建構容器必要標記必須存在於
裝置。
?xml
- 選用。只向 XML 剖析器提供資訊。
manifest.version
- 必要。此資訊清單的中繼版本。說明 清單內預期的元素。與 XML 版本無關。
manifest.type
- 必要。這個資訊清單的類型。其值為
device
裝置資訊清單檔案,以及framework
架構資訊清單 檔案。 manifest.target-level
- 裝置資訊清單必填。指定架構相容性矩陣 (FCM) 版本,裝置資訊清單要指定相容版本 。也就是裝置的出貨 FCM 版本。
manifest.hal
- 選用,可以重複播放。單一 HAL (HIDL 或原生,如 GL)
視
format
屬性而定。 manifest.hal.format
- 選用。該值可以是下列其中一個:
hidl
:HIDL HAL。此為預設值。aidl
:AIDL HAL。 僅適用於資訊清單中繼 2.0 以上版本。native
:原生 HAL。
manifest.hal.max-level
- 選用。僅適用於架構資訊清單。如已設定,最高等級的 HAL 版本資訊清單中的目標 FCM 版本已停用。
manifest.hal.override
- 選用。該值可以是下列其中一個:
true
:使用以下項目覆寫其他<hal>
元素: 請務必使用相同的<name>
和主要版本如果答案為「否」<version>
或<fqname>
已加入<hal>
元素,然後是<hal>
元素 宣告要停用這個 HAL。false
:不要覆寫其他<hal>
元素 並搭配相同的<name>
和主要版本。
manifest.hal.name
- 必要。HAL 的完整套件名稱。多個 HAL 項目可以使用
這個名稱。範例:
android.hardware.camera
(HIDL 或 AIDL HAL)GLES
(原生 HAL,只需要名稱)
manifest.hal.transport
- 如果
manifest.hal.format == "hidl"
,則為必要欄位。不可為 。列載介面從哪個傳輸層 會透過服務管理員查詢這個套件。該值可以是下列其中一個:hwbinder
:繫結模式passthrough
:直通模式
- 如果
manifest.hal.format == "aidl"
為選用,則為選用。不可為 。顯示介面提供時使用的傳輸方式 遠端檢查。值必須符合以下條件:inet
:Inet 通訊端
manifest.hal.transport.ip
和manifest.hal.transport.port
來進一步指定 Inet 連線資訊。 manifest.hal.transport.arch
passthrough
必填,不得包含。hwbinder
。說明直通式服務的位元性 或更新提示該值可以是下列其中一個:32
:32 位元模式64
:64 位元模式32+64
:兩者皆是
manifest.hal.transport.ip
inet
為必要欄位,不得用於其他用途。說明 IP 位址 取得該來源的遠端介面內容manifest.hal.transport.port
inet
為必要欄位,不得用於其他用途。說明通訊埠 遠端介面的可用性manifest.hal.version
- 選用,可以重複播放。以下項目中的
hal
標記版本: 資訊清單。
如果是 HIDL 和原生 HAL,則格式為MAJOR.MINOR
。適用對象 範例,請參閱hardware/interfaces
vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
,或system/hardware/interfaces
。
HIDL 和原生 HAL 可以使用多個版本欄位,只要它們代表 不同的主要版本,每個主要版本只有一個子版本 版本。舉例來說,3.1 和 3.2 無法同時存在,但 1.0 和 3.4 可以。 這項設定會套用至所有同名的hal
元素,除非是override="true"
。<version>
的值不是 與<fqname>
相關聯,因為<fqname>
都有一個版本
如果是 AIDL HAL,<version>
不得包含在執行中的裝置上 Android 11 以下版本。<version>
必須是 單一整數。 每個項目最多只能有一個<version>
(package, interface, instance)
元組。如未顯示,則預設為1
。與「<version>
」的值相關聯 同一個<hal>
中的所有<fqname>
,因為<fqname>
並未提供版本。 manifest.hal.interface
- 必要,可以重複執行,而且不會重複。在
含有執行個體名稱的套件廣告素材可以包含
<hal>
中的<interface>
元素;名稱 不得重複。 manifest.hal.interface.name
- 必要。介面名稱。
manifest.hal.interface.instance
- 必要,可以重複。介面的執行個體名稱。可以擁有多個
介面的執行個體,但沒有重複的
<instance>
元素。 manifest.hal.fqname
- 選用,可以重複播放。另一種指定 HAL 執行個體的方式
名稱為「
manifest.hal.name
」。- 如果是 HIDL HAL,則格式為
@MAJOR.MINOR::INTERFACE/INSTANCE
。 - 如果是 AIDL HAL,則格式為
INTERFACE/INSTANCE
。
- 如果是 HIDL HAL,則格式為
manifest.sepolicy
- 必要。內含所有與這項政策相關的項目。
manifest.sepolicy.version
- 裝置資訊清單必填。宣告 SELinux 版本。這個元件具有
格式:
SDK_INT.PLAT_INT
。 manifest.vendor-ndk
- 必要 (可重複)對架構資訊清單所需的費用不得包含
。多個
<vendor-ndk>
項目必須 不同的<version>
。說明一組 VNDK 快照 整體架構。 manifest.vendor-ndk.version
- 必要。這是代表 VNDK 版本的正整數 完全不必建立快照
manifest.vendor-ndk.library
- 選用,可以重複,而且不會重複。說明一組 VNDK 程式庫
為這個 VNDK 供應商數據匯報的架構而設計。這個值會是
程式庫檔案名稱,例如
libjpeg.so
,包含前置字串lib
,且後置字串.so
。沒有任何路徑元件 。 manifest.system-sdk.version
- 選用,可以重複 (不含重複)只有架構中的用途 資訊清單。說明此架構提供的一組系統 SDK 版本 供應商應用程式。
manifest.kernel
- 選用。說明核心的靜態資訊。
manifest.kernel.target-level
- 選用。說明核心分支版本。該路徑的預設值為
manifest.target-level
(不存在)。必須大於 或等於manifest.target-level
。詳情請見 核心比對規則 。