VINTF中manifest.xml和compatibility_matrix.xml的作用
核心概念:VINTF (Vendor Interface)
首先,要理解这两个文件,必须明白它们存在的背景——VINTF
- 目标:解决 Android 生态的碎片化问题,确保框架(Framework) 和供应商(Vendor) 实现(如 SoC、内核、驱动程序等)能够协同工作,并保证设备在升级系统后仍能保持一致性(Compatibility)
- 角色:它是一个标准化的接口。框架层通过这个接口声明它“需要什么”,供应商实现则通过这个接口声明它“提供了什么”。VINTF 就是匹配这两者的“中间人”
- 类比:就像一个硬件和软件之间的“契约” 或 “菜谱”。框架(厨师)说要做一道菜(系统功能),需要哪些食材(HAL 服务、内核版本等)。供应商(食材供应商)则提供一份清单,说明自己有哪些食材。VINTF 确保厨师拿到的食材能做出想要的菜
而 manifest.xml
和 compatibility_matrix.xml
正是构成这份“契约”的两份关键文件
一. manifest.xml (清单文件)
作用:声明“我提供了什么”
manifest.xml
文件是一个自我描述的文件,由某个实体(通常是系统的一个分区)生成,用于列出该实体所提供的所有接口、功能和服务
谁拥有这个文件?
- 设备制造商 (OEM)/供应商:在
vendor
分区或odm
分区中有一个vendor manifest.xml
(或odm manifest.xml
)。它列出了供应商实现所提供的所有 HAL(硬件抽象层)服务、版本、SeLinux 策略等 - 系统框架:在
system
分区中有一个system manifest.xml
(通常由framework compatibility matrix
编译生成)。它列出了系统框架所提供的功能,例如 Java 接口、原生服务等
manifest.xml 的主要内容:
- HAL 元素:声明提供的 HAL 服务(如
android.hardware.vibrator@2.2::IVibrator
)及其版本 - 内核元素:声明使用的内核版本 (
<version>
) 和配置(如内核模块kmod
,必需的内核配置config
) - SeLinux 策略版本:声明 SeLinux 的版本
- Framework 功能:(仅限系统 Manifest)声明系统 API 等
示例:一个简化的 vendor manifest.xml
<manifest version="2.0" type="device"><hal format="hidl"><name>android.hardware.vibrator</name><transport>hwbinder</transport><version>2.2</version><interface><name>IVibrator</name><instance>default</instance></interface></hal><hal format="aidl"><name>android.hardware.light</name><version>1</version><interface><name>ILight</name><instance>default</instance></interface></hal><kernel version="5.10.43"><config><key>CONFIG_ARM</key><value>y</value></config></kernel><sepolicy><version>30.0</version></sepolicy>
</manifest>
此文件告诉系统:“我(供应商)提供了一个 Vibrator HAL 2.2 版,一个 Light AIDL 服务,内核版本是 5.10.43,并且 SeLinux 版本是 30.0”
二. compatibility_matrix.xml (兼容性矩阵文件)
作用:声明“我需要什么”
compatibility_matrix.xml
文件是一个要求文件,由一个实体制定,用于指定它需要哪些接口、功能和服务才能正常运行
谁拥有这个文件?
- 系统框架:在
system
分区中有一个framework compatibility matrix.xml
。它定义了 Android 框架要正常运行,供应商必须提供哪些 HAL、内核功能等。这是最重要的兼容性矩阵 - 设备制造商 (OEM)/供应商:在
vendor
分区中也可以有一个device compatibility matrix.xml
。它用于声明供应商实现所需的其他可选组件(例如,某些供应商特有的功能需要特定的系统属性支持)
compatibility_matrix.xml 的主要内容:
与 manifest.xml
结构类似,但它表达的是“需求”而非“提供”
- HAL 需求:要求设备必须提供某个特定版本的 HAL(如
android.hardware.vibrator@2.1+
,表示至少需要 2.1 版本) - 内核需求:要求内核必须满足的最低版本 (
<min-version>
) 和必须包含的配置项 - SeLinux 策略版本需求:要求必须达到的最低 SeLinux 版本
- Avb 版本需求:要求 Android Verified Boot 的版本
示例:一个简化的 framework compatibility matrix.xml
<compatibility-matrix version="2.0" type="framework"><hal format="hidl" optional="false"><name>android.hardware.vibrator</name><version>2.1</version> <!-- 至少需要 2.1 版本 --><version>2.2</version> <!-- 但也兼容 2.2 版本 --></hal><kernel version="5.4"> <!-- 要求内核版本至少是 5.4 --><config><key>CONFIG_ARM</key><value>y</value> <!-- 要求内核必须配置 CONFIG_ARM=y --></config></kernel><sepolicy><kernel-sepolicy-version>30</kernel-sepolicy-version> <!-- 要求 SePolicy 版本至少为 30 --></sepolicy>
</compatibility-matrix>
此文件告诉供应商:“我(Android 框架)要能运行,你(供应商)必须至少提供一个 Vibrator HAL 2.1 或 2.2 版本,内核不能低于 5.4,并且必须开启 CONFIG_ARM 配置,SeLinux 策略版本不能低于 30”
两者的交互与深刻理解
现在,我们把两者结合起来,看看 VINTF 如何工作:
- 构建时:OEM 将供应商的
manifest.xml
和系统的compatibility_matrix.xml
组合在一起,通过assemble_vintf
等工具生成最终的设备compatibility matrix
。这个过程会检查需求是否被满足 - 运行时:在设备启动时,
vintf
守护进程会运行 - 收集信息:它从
system
、vendor
、odm
等分区收集所有的manifest.xml
和compatibility_matrix.xml
文件 - 匹配检查:它将所有这些信息组合成一个运行时数据库
○ 它会检查框架的需求 (framework compatibility matrix
) 是否都被供应商的实现 (vendor manifest
) 满足
○ 它也会检查供应商的需求 (device compatibility matrix
, 如果有) 是否被系统和其他分区满足 - 提供信息:
vintf
对象通过dump()
方法或lshal
等工具,将这些信息提供给需要查询的设备信息(如getprop
中的vendor.*
属性)或 OTA 更新服务器
OTA 更新的关键作用:
当系统进行 OTA 更新时,更新的系统镜像中会带有一个新版本的 framework compatibility matrix.xml
。在安装更新前,设备会:
- 检查当前设备上供应商实现的
vendor manifest.xml
- 对比新的框架“需求清单”(新的兼容性矩阵)
- 如果供应商提供的“供给清单”满足新系统的所有需求,则允许OTA更新
- 如果不满足(例如,新系统要求一个 HAL 的 3.0 版本,但供应商只提供了 2.2 版本),则阻止更新,从而避免了更新后设备无法启动或功能异常的问题
总结对比
特性 | manifest.xml | compatibility_matrix.xml |
---|---|---|
核心作用 | 声明供给 (“我有什么”) | 声明需求 (“我要什么”) |
文件类型 | 自我描述 (Self-description) | 要求规范 (Requirement Specification) |
常见位置 | vendor/etc/vintf/ , system/etc/vintf/ | system/etc/vintf/ , vendor/etc/vintf/ |
主要作者 | 供应商 (HAL 实现者) | 谷歌 Android 团队 (定义框架需求) |
内容示例 | <hal><name>vibrator</name><version>2.2</version></hal> | <hal><name>vibrator</name><version>2.1</version></hal> |
关系 | 供应商的“投标书” | 框架的“招标书” |
一句话概括:
VINTF 通过对比供应商 manifest.xml
(我提供了什么)和框架 compatibility_matrix.xml
(我需要什么),确保软硬件双方遵守共同的接口规范,从而实现了 Android 系统的兼容性、可扩展性和可升级性