是Vendor Interface Object的缩写,即厂商接口对象。
Treble Interface组成成分,
在Android O添加的接口:
到Android P新增接口:
Java依赖(使用System SDK),
系统Properties。
VINTF指的是Vendor Interface object,是android 8.0分离system和vendor分区的机制之一,用来检查system和vendor依赖是否匹配。
Framework(system)和Device(vendor)匹配的框架如下:
Manifest 描述了提供给对方的feature(Provider)
Matrix 描述了需要对方提供的feature(Requirement)
Manifest 和 Matrix 在OTA升级前会进行匹配检查,以确保framework和device是兼容的。总的来说,manifest是提供端,matrix是需求端。
Framework manifest文件是由Google手动生成的。
system/libhidl/manifest.xml
/system/manifest.xml
Device manifest文件是和设备,硬件相关的。
device/${VENDOR}/${DEVICE}/manifest.xml
/vendor/manifest.xml
具体清单描述如下:
https://source.android.google.cn/docs/core/architecture/vintf/objects?hl=zh-cn
在您的 Android.bp
或 Android.mk
文件中,将 vintf_fragments
添加到任意模块
具体可查看:
https://source.android.google.cn/docs/core/architecture/vintf/objects?hl=zh-cn#manifest-fragments
本质上就是在汇总manifest的时候,除了常规路径,还会将各个子仓库的VINTF碎片汇总进来。
Framework compatibility matrix描述的是framework对 device的需求。
这个matrix文件是和Android Framework Image(system.img)关联的。
Framework compatibility matrix的这些需要被device manifest支持。
Device compatibility matrix描述了device对framework的需求。
具体兼容性矩阵描述如下:
https://source.android.google.cn/docs/core/architecture/vintf/comp-matrices?hl=zh-cn
有些需求的信息是在运行时搜集的。通过接口
::android::vintf::VintfObject::GetRuntimeInfo(),信息包括以下:
Kernel信息
/proc/config.gz. 压缩过的kernel配置,需要在运行时被转化成一个可查询的对象
/proc/version. 系统调用uname()的到的信息
/proc/cpuinfo. 格式可能根据32位和64位而有所不同
policydb version
/sys/fs/selinux/policyvers (假设selinuxfs加载在/sys/fs/selinux).
Libselinux的security_policyvers() 接口返回结果是一样的
Static Lib AVB version
bootloader system property:ro.boot.vbmeta.avb_version
init/fs_mgr system property:ro.boot.avb_version
VINTF Object也是系统API,提供给hwservicemanager、OTA升级服务、CTS DeviceInfo等模块调用以便获取信息用以匹配。
可查询的供应商接口对象的代码位于system/libvintf
。
C++ 查询API位于:
system/libvintf/VintfObject.cpp
android::vintf::VintfObject
Java 查询API位于:
frameworks/base/core/java/android/os/VintfObject.java
android.os.VintfObject
vendor和system检查不通过会弹窗:
不同工程提供的feature不同,需要差异化配置。
可以在各自feature的mk中通过 DEVICE_MANIFEST_FILE 来申明和该feature相关的 manifest.xml,
编译时候会收集所有mk中的DEVICE_MANIFEST_FILE组合成一个完整的manifest.xml。
https://source.android.com/devices/architecture/aidl/aidl-hals
Google 在Android 11引入了AIDL for HALs,旨在代替HIDL原先的作用。在之后的Android版本推荐使用AIDL 实现Hal层的访问。
这样做的原因,应该有以下几点:
也就是说,VINTF接口后面会演变成aidl接口为主,而不是hidl。
例如,
原来的hidl的接口为:
<manifest version="1.0" type="device">
<hal format="hidl">
<name>vendorabcd.hardware.sensorscalibratename>
<transport>hwbindertransport>
<version>1.0version>
<interface>
<name>ISensorsCalibratename>
<instance>defaultinstance>
interface>
hal>
manifest>
后面改为了如下:
<manifest version="1.0" type="device">
<hal format="aidl">
<name>vendorabcd.hardware.sensorscalibratename>
<transport>hwbindertransport>
<version>1version>
[可以保留原本的写法:]
<interface>
<name>ISensorsCalibratename>
<instance>defaultinstance>
interface>
[或者使用fqname:]
<fqname>ISensorsCalibrate/defaultfqname>
[两种任选一个即可]
hal>
manifest>
细节可参考:
https://source.android.google.cn/docs/core/architecture/vintf/resources?hl=zh-cn
在设备端查看设备清单文件:
/system/bin/lshal --init-vintf
主机端的工具,功能:
#./assemble_vintf --help
assemble_vintf: Checks if a given manifest / matrix file is valid and
fill in build-time flags into the given file.
assemble_vintf -h
Display this help text.
assemble_vintf -i <input file>[:<input file>[...]] [-o <output file>] [-m]
[-c [<check file>]]
Fill in build-time flags into the given file.
-i <input file>[:<input file>[...]]
A list of input files. Format is automatically detected for the
first file, and the remaining files must have the same format.
Files other than the first file should only have <hal> defined;
other entries are ignored. Argument may also be specified
multiple times.
-o <output file>
Optional output file. If not specified, write to stdout.
-m
a compatible compatibility matrix is
generated instead; for example, given a device manifest,
a framework compatibility matrix is generated. This flag
is ignored when input is a compatibility matrix.
-c [<check file>]
The path of the "check file"; for example, this is the path
of the device manifest for framework compatibility matrix.
After writing the output file, the program checks against
the "check file", depending on environment variables.
- PRODUCT_ENFORCE_VINTF_MANIFEST=true: check compatibility
If any check fails, an error message is written to stderr.
Return 1.
--kernel=<version>:<android-base.config>[:<android-base-arch.config>[...]]
Add a kernel entry to framework compatibility matrix or device
manifest. Ignored for other input format.
There can be any number of --kernel for framework compatibility
matrix, but at most one --kernel and at most one config file for
device manifest.
<version> has format: 3.18.0
<android-base.config> is the location of android-base.config
<android-base-arch.config> is the location of an optional
arch-specific config fragment, more than one may be specified
-l, --hals-only
Output has only <hal> entries. Cannot be used with -n.
-n, --no-hals
Output has no <hal> entries (but all other entries).
Cannot be used with -l.
--no-kernel-requirements
Output has no <config> entries in <kernel>, and kernel minor
version is set to zero. (For example, 3.18.0).
计划写一篇VINTF匹配原理和使用,以及stable AIDL调用的文章。