VINTF 对象数据

VINTF 对象在运行时聚合来自设备清单框架清单文件 (XML) 以及设备本身的数据。这两个清单共用一种格式,不过并非所有元素都适用于两者(有关结构的详细信息,请参见清单文件结构)。

设备清单文件

设备清单文件由设备提供。它在 Android 源代码树中位于 device/${VENDOR}/${DEVICE}/manifest.xml,在设备上位于 /vendor/manifest.xml

设备清单示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="device">
    <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>
        <version>2.0</version>
        <interface>
            <name>INfc</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>

框架清单文件

框架清单文件由 Google 提供,是手动生成的文件。它在 Android 源代码树中位于 system/libhidl/manifest.xml,在设备上位于 /system/manifest.xml

框架清单(由 Google 提供)示例:

<?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>
</manifest>

清单文件结构

?xml
可选。只向 XML 解析器提供信息。
manifest.version
必需。清单的版本。描述清单中预期的元素。与 XML 版本无关。
manifest.type
必需。该清单的类型。对于设备清单文件,其值为 device;对于框架清单文件,其值为 framework
manifest.hal
可选且可重复。单个 HAL(HIDL 或本机,如 GL),具体取决于 format 属性。
manifest.hal.format
可选。值可以是以下几项之一:
  • hidl:HIDL HAL。这是默认值。
  • native:本机 HAL。
manifest.hal.name
必需。HAL 的完全限定软件包名称。多个 HAL 条目可以使用相同的名称。示例:
  • android.hardware.camera (HIDL HAL)
  • GLES(本机 HAL,只需要名称)
manifest.hal.transport
manifest.hal.format == "hidl" 时是必需的。在其他情况下,则不得存在。指明从服务管理器查询来自该软件包的接口时将使用什么传输模式。值可以是以下几项之一:
  • hwbinder:绑定模式
  • passthrough:直通模式
manifest.hal.transport.arch
对于 passthrough 是必需的,对于 hwbinder 不得存在。描述正在提供的直通服务的位数。值可以是以下几项之一:
  • 32:32 位模式
  • 64:64 位模式
  • 32+64:两者兼有
manifest.hal.version
必需且可重复。清单中 hal 标记的版本。格式为 MAJOR.MINOR。有关示例,请参阅 hardware/interfacesvendor/${VENDOR}/interfacesframework/hardware/interfaces system/hardware/interfaces

HIDL 和本机 HAL 可以使用多个版本字段,前提是它们代表不同的主要版本,并且提供的每个主要版本只有一个次要版本。例如,3.1 和 3.2 不能共存,但 1.0 和 3.4 可以共存。这适用于所有同名的 hal 元素。
manifest.hal.interface
必需,可以在不重名的情况下进行重复使用。指明软件包中具有实例名称的接口。一个 <hal> 中可以有多个 <interface> 元素,但名称必须不同。
manifest.hal.interface.name
必需。接口的名称。
manifest.hal.interface.instance
必需且可重复。接口的实例名称。一个接口可以有多个实例,但不能有重复的 <instance> 元素。
manifest.sepolicy
必需。包含所有与 sepolicy 相关的条目。
manifest.sepolicy.version
对于设备清单是必需的。用于声明 sepolicy 版本。格式为 SDK_INT.PLAT_INT。

运行时数据

设备清单所需的某些信息只能在运行时收集。信息通过 ::android::vintf::VintfObject::GetRuntimeInfo() 获得,其中包含以下内容:

  • 内核信息,包括:
    • /proc/config.gz:压缩的完整内核配置,该信息需要在运行时读取并转换为可查询的对象。
    • /proc/version:通过 uname() 系统调用获得的信息。
    • /proc/cpuinfo:对于 32 位和 64 位计算机,格式可能会不同。
    • policydb 版本
      • /sys/fs/selinux/policyvers(假设 selinuxfs 装载在 /sys/fs/selinux 处)。
      • 来自 libselinuxsecurity_policyvers() API 可提供相同的信息。
  • 静态 libavb 版本,包括:
    • 引导加载程序系统属性:ro.boot.vbmeta.avb_version
    • init/fs_mgr 系统属性:ro.boot.avb_version

可查询的 API

hwservicemanager、OTA 更新服务、CTS DeviceInfo 以及其他组件需要从 VINTF 对象中获取信息时,该对象是作为系统 API 存在的。