VINTF對象聚合來自設備清單和框架清單文件(XML)的數據。這兩個清單共享一種格式,儘管並非所有元素都適用於這兩種格式(有關架構的詳細信息,請參見清單文件架構)。
設備清單
設備清單(由設備提供)由供應商清單和ODM清單組成。
- 供應商清單指定了SoC通用的HAL,SELinux策略版本等。建議將其放置在
device/ VENDOR / DEVICE /manifest.xml
的Android源代碼樹中,但是可以使用多個片段文件。有關詳細信息,請參閱清單片段和根據片段生成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提供)是手動生成的,位於
/system/libhidl/manifest.xml
的Android源代碼樹中。 - 產品清單(由設備提供)列出了由產品分區上安裝的模塊提供服務的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> <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 。僅在manifest meta-version 2.0及更高版本中有效。 -
native
:本地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.transport.arch
- 所需的
passthrough
,必須不存在對hwbinder
。描述所提供的直通服務的位數。該值可以是以下之一:-
32
位模式 64
位模式32+64
:兩者
-
manifest.hal.version
- 可選,可以重複。清單中
hal
標籤的版本。
對於HIDL和本機HAL,格式為MAJOR . MINOR
。有關示例,請參閱hardware/interfaces
,vendor/${VENDOR}/interfaces
,framework/hardware/interfaces
或system/hardware/interfaces
。
HIDL和本機HAL可以使用多個版本字段,只要它們表示不同的主要版本,每個主要版本僅提供一個次要版本。例如,3.1和3.2不能共存,但是1.0和3.4可以共存。這適用於所有具有相同名稱的hal
元素,除非override="true"
。<version>
的值不與<fqname>
關聯,因為<fqname>
帶有版本。
對於AIDL HAL,運行Android 11及以下<version>
設備上不得存在<version>
。在運行Android S(AOSP實驗)及更高<version>
設備上,<version>
必須為單個整數。每個(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
- 可選,可以重複。指定名稱為
manifest.hal.name
的HAL實例的另一種方法。- 對於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
。有關詳細信息,請參見內核匹配規則。