每日充电:OS+MultiMedia学习之旅
学习理念:一次理解一个知识点
源码环境:Android14
硬件平台:高通骁龙SM7250 学习内容:AAOS车载音频系统VehicleService服务学习 难度:★★★☆☆ 阅读时间:1.8分钟
本文继续分析AAOS车载音频系统VehicleService服务启动过程。
DefaultVehicleHal类继承自VehicleHal,它主要实现VehicleHal与仿真器连接替代真实车辆网络连接。 DefaultVehicleHal构造函数第一个参数VehiclePropertyStore类,通过初始化列表将propStore传给成员变量mPropStore。第二个参数将client传给mVehicleClient。 不知道读者朋友发现没有,实际上在VehicleService.cpp中,DefaultVehicleHal构造函数传入的是DefaultVehicleConnector,这里却是用VehicleHalClient类型来接收的,它俩什么关系呢? 接下来,我们来挖一挖DefaultVehicleConnector和VehicleHalClient类的关系。 先看DefaultVehicleConnector类定义。
从定义中可知,DefaultVehicleConnector继承自模板类IPassThroughConnector,而模板类中传入具体类是VehicleHalClient和DefaultVehicleHalServer,到这我们发现DefaultVehicleConnector和VehicleHalClient类还是没有扯上关系。 从第36行可知,DefaultVehicleConnector() = default;使用默认构造函数。 那么,我们继续往下看IPassThroughConnector模板类的定义。 IPassThroughConnector模板类的定义模板类IPassThroughConnector接受两个类型参数,分别是VehicleClientType、VehicleServerType,并且IPassThroughConnector继承自VehicleClientType和VehicleServerType类,意味着IPassThroughConnector 的实例将能够访问VehicleClientType 和VehicleServerType 的公开和保护成员。 这里的VehicleClientType类型其实就是传入的DefaultVehicleConnector类。 因为DefaultVehicleConnector继承自IPassThroughConnector<VehicleHalClient>,而IPassThroughConnector<VehicleHalClient>继承自VehicleHalClient.,所以DefaultVehicleConnector的对象可以隐式转为VehicleHalClient类型的指针,即 VehicleHalClient基类。搞清楚这一步以后,我们继续分析DefaultVehicleHal构造函数,看看它内部的实现。 DefaultVehicleHal构造函数内部实现那么mVehicleClient是哪里传入的呢? 就是在DefaultVehicleHal构造函数中,client对象赋值给mVehicleClient的,getAllPropertyConfig的实现在Binder服务端,从服务端获取所有配置属性。 VehicleHalClient继承自IVehicleClient接口类,并且getAllPropertyConfig是IVehicleClient类的一个纯虚函数,必须由其子类实现。 getAllPropertyConfig纯虚函数实现在模板类IPassThroughConnector中。 说完DefaultVehicleHal构造函数中,再回到开头,我们继续分析VehicleHalManager构造函数。
而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服务过程,这里就不再赘述了。
我们以提问的方式来总结: 1.AAOS车载系统VehicleService服务完整HIDL服务名是什么? android.hardware.automotive.vehicle@2.0::IVehicle/default
2.VehicleService的HIDL服务是被谁拉起来的呢? 3.VehicleService是在哪个进程中开启HIDL服务的? android.hardware.automotive.vehicle@2.0-default-service 4.AAOS 14中依然使用HIDL服务接口。
★★★★★★★★★★< END >★★★★★★★★★★
|