Manifests

VINTF 对象聚合来自设备清单框架清单文件 (XML) 的数据。 两种清单共享一种格式,但并非所有元素都适用于两者(有关架构的详细信息,请参阅清单文件架构)。

设备清单

设备清单(由设备提供)由供应商清单和 ODM 清单组成。

  • 供应商清单指定 SoC 通用的 HAL、SELinux 策略版本等。 建议将其放置在 Android 源代码树中的 device/VENDOR/DEVICE/manifest.xml,但可以使用多个片段文件。 有关详细信息,请参阅清单片段从片段生成 DM
  • ODM 清单列出了 ODM 分区中特定于产品的 HAL。 VINTF 对象按以下顺序加载 ODM 清单
    1. 如果定义了 SKU(其中 SKU 是属性 ro.boot.product.hardware.sku 的值),则为 /odm/etc/vintf/manifest_SKU.xml
    2. /odm/etc/vintf/manifest.xml
    3. 如果定义了 SKU,则为 /odm/etc/manifest_SKU.xml
    4. /odm/etc/manifest.xml
  • 供应商清单列出了供应商分区中特定于产品的 HAL。 VINTF 对象按以下顺序加载供应商清单
    1. 如果定义了 SKU(其中 SKU 是属性 ro.boot.product.vendor.sku 的值),则为 /vendor/etc/vintf/manifest_SKU.xml
    2. /vendor/etc/vintf/manifest.xml
  • VINTF 对象按以下顺序加载设备清单
    1. 如果供应商清单存在,则合并以下内容
      1. 供应商清单
      2. 可选的供应商清单片段
      3. 可选的 ODM 清单
      4. 可选的 ODM 清单片段
    2. 否则,如果 ODM 清单存在,则将 ODM 清单与可选的 ODM 清单片段合并。
    3. /vendor/manifest.xml(旧版,无片段)
    4. 最后,合并来自任何供应商 APEX 的清单片段。 清单片段从每个 APEX 的 etc/vintf 目录加载(例如 /apex/<apex name>/etc/vintf)。

    请注意:

    • 在旧版设备上,使用旧版供应商清单和 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 清单(由设备提供)列出了以下内容:
    • 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>
    <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.bpAndroid.mk 文件中,将 vintf_fragments 添加到显式安装在设备上的任何模块,例如 cc_binaryrust_binary。 例如,您可以使用您的 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,它安装在 vendorodm 分区中。 如果它安装在 systemproductsystem_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 中,请将与其关联的 VINTF 片段与 prebuilt_etc 一起打包在同一 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。 这是默认值。
  • aidlAIDL 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:Binderized 模式
  • passthrough:Passthrough 模式
manifest.hal.format == "aidl" 时为可选。 否则不得出现。 说明当远程提供接口时使用哪种传输方式。 该值必须是:
  • inet:Inet 套接字
manifest.hal.transport.ipmanifest.hal.transport.port 必须用于进一步指定 Inet 连接信息。
manifest.hal.transport.arch
passthrough 为必需,hwbinder 不得存在。 描述正在提供的 passthrough 服务的位数。 该值可以是以下之一:
  • 32:32 位模式
  • 64:64 位模式
  • 32+64:两者
manifest.hal.transport.ip
inet 为必需,否则不得出现。 描述从中提供远程接口的 IP 地址。
manifest.hal.transport.port
inet 为必需,否则不得出现。 描述从中提供远程接口的端口。
manifest.hal.version
可选,可以重复。 清单中 hal 标记的版本。

对于 HIDL 和原生 HAL,格式为 MAJOR.MINOR。 有关示例,请参阅 hardware/interfacesvendor/${VENDOR}/interfacesframeworks/hardware/interfacessystem/hardware/interfaces

HIDL 和原生 HAL 可以使用多个版本字段,只要它们代表不同的主版本号,并且每个主版本号仅提供一个次版本号。 例如,3.1 和 3.2 不能共存,但 1.0 和 3.4 可以。 这适用于所有具有相同名称的 hal 元素,除非 override="true"<version> 的值与 <fqname> 不关联,因为 <fqname> 携带版本号。

对于 AIDL HAL,在运行 Android 11 及更低版本的设备上,不得出现 <version>。 在运行 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
可选,可以重复。 指定具有名称 manifest.hal.name 的 HAL 实例的另一种方法。
  • 对于 HIDL HAL,格式为 @MAJOR.MINOR::INTERFACE/INSTANCE
  • 对于 AIDL HAL,格式为 INTERFACE/INSTANCE
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。 有关详细信息,请参阅内核匹配规则