参考实现

我们提供了 AIDL VHAL 的参考实现。主服务线程是在 VehicleService.cpp 中实现。VHAL 接口实现位于 DefaultVehicleHal.cpp

参考实现采用双层架构。上层是 DefaultVehicleHal,实现了 VHAL AIDL 接口,并提供适用于所有硬件设备的通用 VHAL 逻辑。下层是 FakeVehicleHardware,实现了 IVehicleHardware 接口。此类可模拟与实际硬件或车载总线交互的 VHAL 逻辑,并且特定于设备。供应商也可以视需要调整这一架构,重复使用同一 DefaultVehicleHal 类(扩展该类以覆盖某个方法),并提供自己的 IVehicleHardware 实现。

VHAL 参考实现
图 1. VHAL 参考实现

DefaultVehicleHal 包含以下被认为适用于任何 VHAL 实现的通用逻辑:

  • 实现 IVehicle 接口。
  • 执行基本的输入检查,包括检查是否存在重复 ID。
  • 为每个 binder 客户端的每个操作分配客户端对象(例如 GetValuesClient),并将每个对象添加到全局池。
  • 管理异步回调逻辑,例如将待处理请求添加到待处理请求池。在我们收到结果时解决待处理的请求,或者在某个待处理的请求超时时返回错误。
  • 序列化和反序列化 LargeParcelable(详见 ParcelableUtils.h)。
  • 管理订阅(详见 SubscriptionManager.h)。
  • 检查权限(详见 checkReadPermissioncheckWritePermission 函数)。
  • 定期调用 IVehicleHardware.checkHealth 并发送检测信号(详见 checkHealth 函数)。

IVehicleHardware 是一个通用接口,用于表示 VHAL 的硬件专用实现。IVehicleHardware 的参考实现是 FakeVehicleHardware,它使用内存中映射存储属性值,并且不与实际车载总线通信。其目的是在模拟器上运行,不依赖特定硬件。供应商实现不能直接使用它,而必须添加车载总线特定的逻辑。

在 Android 14 中,FakeVehicleHardware 会在初始化期间从设备的 /vendor/etc/automotive/vhalconfig/ 文件夹中读取运行时支持的属性配置,该文件夹包含一个 JSON 样式的配置文件。如需了解配置文件格式和配置文件内容,请参阅参考 VHAL 自述文件

FakeVehicleHardware 还支持使用配置文件替换进行测试。如果设置了系统属性 persist.vendor.vhal_init_value_override,它会使用设备上 /vendor/etc/automotive/vhaloverride/ 文件夹中的配置文件来替换现有配置。供应商实现可以使用类似的方法,这样 VHAL 支持的属性配置就不是硬编码的,而是可以在启动时动态决定。设备启动后,车辆属性配置必须是静态的。