分享

Android14音频进阶第十六弹:AAOS车载音频系统VehicleService服务学习(02)

 Neal199 2024-03-30 发布于安徽

每日充电:OS+MultiMedia学习之旅


学习理念:一次理解一个知识点

源码环境:Android14

硬件平台:高通骁龙SM7250

学习内容:AAOS车载音频系统VehicleService服务学习

难度:★★★☆☆

阅读时间:1.8分钟


01

Image
Image
VehicleService服务进程
  • hardware/interfaces/automotive/vehicle/2.0/default/VehicleService.cpp

Image

  • 为了帮助理解,重新画了一个类关系图,来回顾下VehiclePropertyStore、DefaultVehicleConnector、DefaultVehicleHal、VehicleHalManager类之间的关系。

Image

  • 先来分析一下DefaultVehicleHal构造函数。

02

Image
Image
DefaultVehicleHal构造函数
  • hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp

Image

  • DefaultVehicleHal类继承自VehicleHal,它主要实现VehicleHal与仿真器连接替代真实车辆网络连接。

  • DefaultVehicleHal构造函数第一个参数VehiclePropertyStore类,通过初始化列表将propStore传给成员变量mPropStore。第二个参数将client传给mVehicleClient。

  • 不知道读者朋友发现没有,实际上在VehicleService.cpp中,DefaultVehicleHal构造函数传入的是DefaultVehicleConnector,这里却是用VehicleHalClient类型来接收的,它俩什么关系呢?

  • 接下来,我们来挖一挖DefaultVehicleConnector和VehicleHalClient类的关系。

  • 先看DefaultVehicleConnector类定义。

03

Image
Image
DefaultVehicleConnector类
  • hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleConnector.h

Image

  • 从定义中可知,DefaultVehicleConnector继承自模板类IPassThroughConnector,而模板类中传入具体类是VehicleHalClient和DefaultVehicleHalServer,到这我们发现DefaultVehicleConnector和VehicleHalClient类还是没有扯上关系。

  • 从第36行可知,DefaultVehicleConnector() = default;使用默认构造函数。

  • 那么,我们继续往下看IPassThroughConnector模板类的定义。

04

Image
Image
IPassThroughConnector模板类的定义
  • hardware/interfaces/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleConnector.h

Image

  • 模板类IPassThroughConnector接受两个类型参数,分别是VehicleClientType、VehicleServerType,并且IPassThroughConnector继承自VehicleClientType和VehicleServerType类,意味着IPassThroughConnector的实例将能够访问VehicleClientTypeVehicleServerType的公开和保护成员。

  • 这里的VehicleClientType类型其实就是传入的DefaultVehicleConnector类。

  • 因为DefaultVehicleConnector继承自IPassThroughConnector<VehicleHalClient>,而IPassThroughConnector<VehicleHalClient>继承自VehicleHalClient.,所以DefaultVehicleConnector的对象可以隐式转为VehicleHalClient类型的指针,即

  • VehicleHalClient基类。
  • 搞清楚这一步以后,我们继续分析DefaultVehicleHal构造函数,看看它内部的实现。

05

Image
Image
DefaultVehicleHal构造函数内部实现
  • hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0/DefaultVehicleHal.cpp

Image

  • 首先第78行调用initStaticConfig函数,初始化静态参数配置,将所有属性配置遍历出来,通过VehiclePropertyStore::registerProperty函数,将属性设置下去。

  • DefaultVehicleHal::initStaticConfig函数实现如下所示:

Image

  • 那么mVehicleClient是哪里传入的呢?

  • 就是在DefaultVehicleHal构造函数中,client对象赋值给mVehicleClient的,getAllPropertyConfig的实现在Binder服务端,从服务端获取所有配置属性。

  • VehicleHalClient继承自IVehicleClient接口类,并且getAllPropertyConfig是IVehicleClient类的一个纯虚函数,必须由其子类实现。

  • getAllPropertyConfig纯虚函数实现在模板类IPassThroughConnector中。

  • 说完DefaultVehicleHal构造函数中,再回到开头,我们继续分析VehicleHalManager构造函数。

06

Image
Image
VehicleHalManager构造函数
  • hardware/interfaces/automotive/vehicle/2.0/default/common/include/vhal_v2_0/VehicleHalManager.h

Image

  • VehicleHalManager构造函数传入的是DefaultVehicleHal实例对象,然而接收类型却是VehicleHal类,这是怎么个事呢?

  • 其实DefaultVehicleHal是VehicleHal的子类,定义如下所示:

Image

  • 而hal.get()实际表示DefaultVehicleHal类原始类对象。

  • 再往下看第55行init初始化函数,在VehicleHalManager::init内部调用mHal->init(),mHal其实就是DefaultVehicleHal类对象传入的,那么init函数实现在哪呢?

  • 答案是在DefaultVehicleHal的父类VehicleHal中,在父类中调用VehicleHal::init函数,在它内部接着调用onCreate函数,然而onCreate是一个虚函数,实现是空的,结果又回到子类DefaultVehicleHal,真的是绕了一圈又回去了DefaultVehicleHal中。

  • 接着调用DefaultVehicleHal::onCreate函数,它解析支持的属性列表并生成属性值向量以保存当前值。

  • 解析完VehicleHalManager构造函数,紧接着调用service->registerAsService注册VehicleService服务。其实它的完整服务名叫:android.hardware.automotive.vehicle@2.0::IVehicle/default。

  • 这里VehicleService服务使用的是HIDL,HIDL服务注册过程前面文章已经分析讲解过registerAsService注册HIDL服务过程,这里就不再赘述了。

07

Image
Image
总结一下

我们以提问的方式来总结:

1.AAOS车载系统VehicleService服务完整HIDL服务名是什么?

android.hardware.automotive.vehicle@2.0::IVehicle/default

2.VehicleService的HIDL服务是被谁拉起来的呢?

vendor.vehicle-hal-2.0

3.VehicleService是在哪个进程中开启HIDL服务的?

android.hardware.automotive.vehicle@2.0-default-service

​​​

4.AAOS 14中依然使用HIDL服务接口。

★★★★★★★★★★< END >★★★★★★★★★



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约