当前位置: 首页 > article >正文

代码解析:安卓VHAL的AIDL参考实现

以下内容基于安卓14的VHAL代码。

总体架构

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

图1

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

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

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

调用时序

下面以setValues()接口为例进行说明:

FakeVehicleHardware实现了IVehicleHardware。

图2

PendingRequestHandler中有一个线程,一直在处理request。

图3

最终,FakeVehicleHardware将value写入VehiclePropertyStore::Record中保存。这里只是参考实现,所以没有实际发送给对手件,只是将数值存入VHAL。

图4

接口文件定义

HIDL VHAL中接口定义文件为types.hal,IVehicle.hal和IVehicleCallback.hal。

AIDL VHAL中,IVehicle .aidl和IVehicleCallback.aidl对应IVehicle.hal和IVehicleCallback.hal。

types.hal中的内容则是拆分到VehicleProperty.aidl,VehiclePropertyGroup.aidl, VehicleArea.aidl, VehiclePropertyType.aidl等等多个aidl文件中。其中VehicleProperty.aidl是用来添加信号ID的。

下面是VehicleProperty.aidl中一个原生的信号

HVAC_FAN_SPEED = 0x0500 + 0x10000000 + 0x05000000  + 0x00400000, // VehiclePropertyGroup:SYSTEM,VehicleArea:SEAT,VehiclePropertyType:INT32

信号ID的计算方式从types.hal中的或运算改为了更直观的加法,但信号ID的结构并没有发生变化,还是由4位的ID、VehiclePropertyGroup 、VehicleArea 、VehiclePropertyType 这4个部分组成。

默认值定义

HIDL VHAL中,定义默认值使用的文件为DefaultConfig.h,格式

        {.config = {.prop = toInt(VehicleProperty::HVAC_FAN_SPEED),

                    .access = VehiclePropertyAccess::READ_WRITE,

                    .changeMode = VehiclePropertyChangeMode::ON_CHANGE,

                    .areaConfigs = {VehicleAreaConfig{

                            .areaId = HVAC_ALL, .minInt32Value = 1, .maxInt32Value = 7}}},

         .initialValue = {.int32Values = {3}}},

AIDL VHAL中,定义默认值使用的文件为DefaultProperties.json,格式

        {

            "property": "VehicleProperty::HVAC_FAN_SPEED",

            "defaultValue": {

                "int32Values": [

                    3

                ]

            },

            "areas": [

                {

                    "areaId": "Constants::SEAT_1_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_1_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_LEFT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_RIGHT",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                },

                {

                    "areaId": "Constants::SEAT_2_CENTER",

                    "minInt32Value": 1,

                    "maxInt32Value": 7

                }

            ]

        },

interfaces\automotive\vehicle\aidl\impl\default_config\config\README.md在README文件中有对json的格式有具体说明。

附录

最后附上本文中plantuml流程图的代码:

图2:

@startuml
'https://plantuml.com/sequence-diagram
'AIDL setValue

autonumber

AIDL_Client -> DefaultVehicleHal: setValues
DefaultVehicleHal -> FakeVehicleHardware: setValues
FakeVehicleHardware -> PendingRequestHandler: addRequest

@enduml

图4:

@startuml
'https://plantuml.com/sequence-diagram

autonumber

PendingRequestHandler -> PendingRequestHandler: handleRequestsOnce
PendingRequestHandler -> FakeVehicleHardware: handleSetValueRequest
FakeVehicleHardware -> FakeVehicleHardware: setValue
FakeVehicleHardware -> VehiclePropertyStore: writeValue
@enduml


http://www.kler.cn/a/456945.html

相关文章:

  • 【Java 新特性】常用函数式接口
  • Java开发工具-Jar命令
  • MyBatis使用的设计模式
  • 安卓触摸事件的传递
  • 12.30 Redis网络模型基础 IO NIO多路复用
  • Python跨年烟花
  • Android 自定义shell命令
  • 4.银河麒麟V10(ARM) 离线安装 MySQL
  • 在线学习平台-项目技术点-前台
  • Mono里运行C#脚本6—mono加载EXE文件和DLL文件保存的HASH表
  • PPO(近端策略优化)算法基本原理
  • 跨境办公的网络如何选择?
  • [Rust开发]actix_webmiddleware 中间件
  • CSS系列(42)-- Backdrop Filter详解
  • 基于深度学习的图像超分辨率重建
  • LeetCode 349. 两个数组的交集 (C++实现)
  • nginx反向代理单台 Web 服务器实验
  • (长期更新)《零基础入门 ArcGIS(ArcMap) 》实验五----土地整治(超超超详细!!!)
  • elasticsearch 杂记
  • Android `android.graphics` 包深度解析:架构与设计模式
  • Unity:武器部件指示 / 高级自定义UI组件开发 / Unity Job加速
  • Linux -Vim
  • SpringMVC学习(二)——RESTful API、拦截器、异常处理、数据类型转换
  • Java-37 深入浅出 Spring - IoC容器体系 循环依赖 原型Bean 原型作用域 Lazy ObjectFactory
  • mongodb(6.0.15)安装注意事项,重装系统后数据恢复
  • 【Redis】Redis 典型应用 - 缓存 (cache)