我们为 AIDL VHAL 提供了参考实现。主服务线程在 VehicleService.cpp
中实现。VHAL 接口实现在 DefaultVehicleHal.cpp
中。
参考实现基于两层架构。在上层,DefaultVehicleHal
实现了 VHAL AIDL 接口,并提供了所有硬件设备通用的 VHAL 逻辑。在下层,FakeVehicleHardware
实现了 IVehicleHardware
接口。此类模拟了与实际硬件或车辆总线交互的 VHAL 逻辑,并且是设备专用的。供应商可以选择采用相同的架构,重用相同的 DefaultVehicleHal
类(对其进行扩展以覆盖方法),并提供他们自己的 IVehicleHardware
实现。
DefaultVehicleHal
包含以下被认为是通用的逻辑,可以应用于任何 VHAL 实现。
- 实现
IVehicle
接口。 - 执行基本输入检查,包括重复 ID 检查。
- 为每个绑定器客户端的每个操作分配客户端对象(例如,
GetValuesClient
),并将每个对象添加到全局池。 - 管理异步回调逻辑,例如将待处理请求添加到待处理请求池。当我们收到结果时解析待处理请求,或者在其中一个待处理请求超时时返回错误。
- 序列化和反序列化
LargeParcelable
(请参阅ParcelableUtils.h
)。 - 管理订阅(请参阅
SubscriptionManager.h
)。 - 检查权限。(请参阅
checkReadPermission
和checkWritePermission
函数)。 - 定期调用 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 支持的属性配置不是硬编码的,并且可以在启动时动态决定。车辆属性配置在设备启动后必须是静态的。