VINTF 對象聚合來自設備清單和框架清單文件 (XML) 的數據。兩個清單共享一種格式,但並非所有元素都適用於兩者(有關架構的詳細信息,請參閱清單文件架構)。
設備清單
設備清單(由設備提供)由供應商清單和 ODM 清單組成。
- 供應商清單指定 SoC 通用的 HAL、SELinux 策略版本等。建議放在 Android 源碼樹
device/ VENDOR / DEVICE /manifest.xml
中,但可以使用多個片段文件。有關詳細信息,請參閱清單片段和從片段生成 DM 。 - ODM 清單列出了特定於ODM 分區中產品的 HAL。 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 清單與可選的 ODM 清單片段結合起來。
-
/vendor/manifest.xml
(舊版,無片段)
注意:
- 在舊設備上,使用舊供應商清單和 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
中。 - 產品清單(由設備提供)列出了安裝在產品分區上的模塊所服務的 HAL。
- 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
分區。如果它安裝到system
、 product
或system_ext
分區,請使用 type framework
而不是 type 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>
清單文件架構
本節介紹這些 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
- 可選的。僅在框架清單上有效。如果設置,則會禁用框架清單中最大級別低於目標 FCM 版本的 HAL。
-
manifest.hal.override
- 可選的。該值可以是以下之一:
-
true
: 用相同的<name>
和主要版本覆蓋其他<hal>
元素。如果此<hal>
元素中沒有<version>
或<fqname>
,則<hal>
元素聲明此 HAL 被禁用。 -
false
:不要覆蓋具有相同<name>
和主要版本的其他<hal>
元素。
-
-
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
位模式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>
在運行 Android 12 及更高版本的設備上必須是單個整數。每個(package, interface, instance)
元組最多只能有一個<version>
。如果不存在,則默認為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
- 必需的。包含所有與 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
。有關詳細信息,請參閱內核匹配規則。