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