HAL 可测试性检查

Android 9 供应商测试套件 (VTS) 支持一种运行时方法,可利用设备配置来识别应针对相应设备目标跳过哪些 VTS 测试。

VTS 测试灵活性

自 Android 8.0 开始,所有搭载 Android 8.0 及更高版本的设备都需要完成 VTS 测试。不过,并非任何 VTS 测试都适用于所有设备目标。例如:

  • 如果特定设备不支持某个测试 HAL(例如 IR),则 VTS 无需针对该设备目标运行该 HAL 测试。
  • 如果多个设备共享相同的 SoC 和供应商映像,但具有不同的硬件功能,则 VTS 必须确定应针对特定设备目标运行还是跳过测试。

VTS 测试类型

VTS 包含以下测试类型:

  • 合规性测试可确保框架和供应商分区之间的兼容性。搭载 Android 8.0 或更高版本的设备需要运行(并通过)这些测试。
  • 非合规性测试可帮助供应商提高产品质量(性能/模糊测试等)。这些测试对供应商来说是可选测试。

测试是否属于合规性测试,取决于测试属于哪个计划。通过 VTS 计划运行的测试被视为合规性测试。

确定支持哪些 HAL

VTS 可以根据以下文件确定设备目标是否支持特定 HAL:

  • /system/compatibility_matrix.xml。用于声明框架所需的 HAL 实例。例如:
    <hal format="hidl" optional="true">
        <name>android.hardware.vibrator</name>
        <version>1.0-1</version>
        <interface>
           <name>IVibrator</name>
           <instance>default</instance>
        </interface>
    </hal>
    
    • optional 属性可以指示框架是否严格要求使用相应 HAL。
    • 该文件可能针对同一 HAL 包含多个条目(具有相同的名称),但版本和接口有所不同。
    • 该文件可能针对同一条目包含多个 version 配置,表明框架支持不同的版本。
    • version1.0-1 表示框架最低可支持版本 1.0,并且不需要高于 1.1 的版本。
  • 设备 manifest.xml。用于声明供应商提供的 HAL 实例。例如:
    <hal format="hidl">
        <name>android.hardware.vibrator</name>
        <transport>hwbinder</transport>
        <version>1.2</version>
        <interface>
            <name>IVibrator</name>
           <instance>default</instance>
        </interface>
    </hal>
    
    • 该文件可能针对同一 HAL 包含多个条目(具有相同的名称),但版本和接口有所不同。
    • 如果该文件针对一个条目仅包含单个 version 配置,则 version1.2 表示供应商支持从 1.0 到 1.2 的所有版本。
  • lshal。设备上的一个工具,用于显示已向 hwservicemanager 注册的 HAL 服务的相关运行时信息。例如:
    android.hardware.vibrator@1.0::IVibrator/default
    

    lshal 还会显示具有直通实现(即在设备上具有相应的 -impl.so 文件)的所有 HAL。例如:
    android.hardware.nfc@1.0::I*/* (/vendor/lib/hw/)
    android.hardware.nfc@1.0::I*/* (/vendor/lib64/hw/)
    

合规性测试

对于合规性测试,VTS 依赖供应商清单来确定(和测试)设备提供的所有 HAL 实例。决策流程如下所示:

合规性可测试性检查

图 1. VTS 合规性测试的可测试性检查

非合规性测试

对于非合规性测试,VTS 依赖供应商清单和 lshal 输出来确定(和测试)未在 manifest.xml 文件中声明的实验性 HAL。决策流程如下所示:

非合规性可测试性检查

图 2. VTS 非合规性测试的可测试性检查

查找供应商清单

VTS 按以下顺序在以下位置查找供应商 manifest.xml 文件:

  1. /vendor/etc/vintf/manifest.xml + ODM 清单(如果这两个位置定义了同一 HAL,则 ODM 清单将替换 /vendor/etc/vintf/manifest.xml 中的 HAL)
  2. /vendor/etc/vintf/manifest.xml
  3. ODM manifest.xml 文件,按以下顺序从以下文件加载:
    1. /odm/etc/vintf/manifest_$(ro.boot.product.hardware.sku).xml
    2. /odm/etc/vintf/manifest.xml
    3. /odm/etc/manifest_$(ro.boot.product.hardware.sku).xml
    4. /odm/etc/manifest.xml
    5. /vendor/manifest.xml

VTS 可测试性检查工具

vts_testibility_checker 是与 VTS 打包在一起的二进制程序,VTS 测试框架会在运行时使用该工具确定指定的 HAL 测试是否可测试。该工具基于 libvintf 来加载和解析供应商清单文件,并实现上一部分中所述的决策流程。

要使用 vts_testability_check,请运行以下命令:

  • 对于合规性测试:
    vts_testability_check -c -b <bitness>  <hal@version>
    
  • 对于非合规性测试:
    vts_testability_check -b <bitness>  <hal@version>
    

vts_testability_check 的输出采用以下 json 格式:

{testable: <True/False> Instances: <list of instance names of HAL service>}

确定会访问哪些 HAL

要确定 VTS 测试会访问哪些 HAL,请确保每个 HAL 测试都使用 VtsHalHidlTargetTestEnvBase 模板注册要在测试中访问的 HAL。接下来,VTS 测试框架会在预处理测试时提取已注册的 HAL。

对于合规性测试,您还可以检查 /system/etc/vintf/manifest.xml。如果此文件中定义了 HAL,则 VTS 应测试该 HAL(对于系统提供的 HAL 服务(例如 graphics.composer/vr),HAL 在 /system/manifest.xml 中声明)。