参考实现

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

参考实现基于两层架构。在上层,DefaultVehicleHal 实现了 VHAL AIDL 接口,并提供了所有硬件设备通用的 VHAL 逻辑。在下层,FakeVehicleHardware 实现了 IVehicleHardware 接口。此类模拟了与实际硬件或车辆总线交互的 VHAL 逻辑,并且是设备专用的。供应商可以选择采用相同的架构,重用相同的 DefaultVehicleHal 类(对其进行扩展以覆盖方法),并提供他们自己的 IVehicleHardware 实现。

VHAL reference implementation
图 1. VHAL 参考实现

DefaultVehicleHal 包含以下被认为是通用的逻辑,可以应用于任何 VHAL 实现。

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

IVehicleHardware 是一个通用接口,用于表示 VHAL 的硬件特定实现。IVehicleHardware 的参考实现是 FakeVehicleHardware,它使用内存映射来存储属性值,并且不与实际车辆总线通信。它旨在在模拟器上运行,并且没有硬件特定的依赖项。供应商实现不得按原样使用它,而必须添加特定于车辆总线的逻辑。

在 Android 14 中,FakeVehicleHardware 在初始化期间从设备的 /vendor/etc/automotive/vhalconfig/ 文件夹中读取支持的属性配置,该文件夹包含 JSON 样式的配置文件。有关配置文件格式和配置文件内容,请参阅 VHAL 参考 README 文件

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