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 清單(由設備提供)列出了以下內容:
- HAL 由安裝在 system_ext 分割區上的模組提供服務;
- 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
分區,請使用類型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中,請使用「prebuilt_etc」將其關聯的 VINTF 片段打包在同一 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
- 選修的。僅對框架清單有效。如果設置,則停用最大等級低於框架清單中的目標 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
位元模式 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 及更低版本的裝置上。在運行 Android 12 及更高版本的裝置上,<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
- 可選,可以重複。另一種為 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
。有關詳細信息,請參閱內核匹配規則。