Android Automotive(九)总结
前面介绍了Android Automtive在各层的功能实现,这里总结一下。
系统框架层
启动流程
系统框架层从SystemServer
启动开始,
SystemServer
会通过bindService
的形式启动CarService
CarService
创建ICarImpl
,然后执行其init
方法ICarImpl
中会创建VehicleHal
、CarPropertyService
对象,并将VehicleHal
中创建的PropertyHalService
作为参数传给CarPropertyService
。VehicleHal
中创建PropertyHalService
、HalClient
对象- 然后
ICarImpl
中会调用init方法初始化VehicleHal
VehicleHal
会执行PropertyHalService
的takeProperties
进行初始化ICarImpl
中调用init方法初始化CarPropertyService
订阅流程
订阅一个车辆属性值从Car API开始,需要应用主动调用。
Application
调用registerCallback
向CarPropertyManager
订阅车辆属性的监听CarPropertyManager
调用registerListener
向CarPropertyService
订阅车辆属性,传入ICarPropertyEventListener
CarPropertyService
会调用subscribeProperty
向PropertyHalService
订阅事件PropertyHalService
会调用subscribeProperty
将事件交给VehicleHal
处理VehicleHal
调用HalClient
的subscribe
方法将订阅事件发给硬件抽象层的VehicleService
而回调过程是由硬件抽象层的VehicleService
发起的,最初会由VehicleHal
接受到,然后进行分发。
VehicleHal
调用PropertyHalService
的onHalEvents
方法PropertyHalService
调用CarPropertyService
的onPropertyChange
方法。CarPropertyService
中会调用ICarPropertyEventListener
的onEvent
方法,将事件回调给CarPropertyManager
CarPropertyManager
通过onPropertyChanged
方法,将事件回调给Application
获取流程
获取一个车辆属性值从Car API开始,需要应用主动调用
设置流程
设置一个车辆属性值从Car API开始,需要应用主动调用
硬件抽象层
硬件抽象层的进程是由initrc
启动的,启动的时间比系统框架层的CarService
早。
启动流程
initrc
启动VehicleService
,执行VehicleService
的main
函数。- 创建
VehiclePropertyStore
对象,用于存储硬件抽象层的车辆属性配置 - 创建
PassthroughConnector
对象,用于处理车辆属性的获取、设置和订阅处理 - 创建
EmulatedVehicleHal对象
,负责对车辆属性的业务逻辑处理 - 创建
VehicleEmulator
对象,一个连接模拟器的对象,用来模拟ECU发来数据。 - 创建
VehicleHalManager
对象,实现HIDL接口,对接跨进程通信的入口。
订阅流程
订阅从CarService
开始,调用到硬件抽象层,当然也支持直接在硬件抽象层进行订阅
CarService
的订阅申申请subscribe
由HIDL接口调用到VehicleHalManager
VehicleHalManager
会调用EmulatedVehicleHal
的subscribe
完成订阅
而回调流程由VehicleHalClient
开始触发,
VehileEmulator
会调用VehicleHalClient
的onPropertyValue
函数,通知车辆属性发生变化VehicleHalClient
会调用EmulatedVehicleHal
的onPropertyValue
函数EmulatedVehicleHal
则调用VehicleHalManager
的onHalEvent
通知车辆属性变化VehicleHalManager
通过onPropertyEvent
函数将车辆属性变化通知给CarService
获取流程
获取一个车辆属性的流程
CarService
会调用get
方法请求从硬件抽象层的VehicleService
获取车辆属性VehicleHalManager
会调用EmulatedVehicleHal
的get
方法获取车辆属性EmulatedVehicleHal
则会从VehiclePropertyStore
的数据容器中取当前的车辆属性配置给到CarService
这里VehiclePropertyStore
中会及时更新车辆属性的变化,所以取到的内容就是最新的
设置流程
设置一个车辆属性的流程
CarService
会调用set
方法请求硬件抽象层的VehicleService
设置车辆属性VehicleHalManager
会调用EmulatedVehicleHal
的set
方法设置车辆属性EmulatedVehicleHal
则会从调用VehicleConnector
的setProperty
方法VehicleConnector
的setProperty
方法会调用到VehicleHalServer
的onSetProperty
方法来完成车辆属性的设置。
由于VehicleHalServer
并没有真的完成和ECU的通信,所以到这里设置就算完成了。
一些变化
-
架构图
Android P - Android S
Android N - Android O
Android P开始,删除了VehicleNetwork
模块, 系统框架层CarService和原生硬件抽象层HAL直接交互。
-
Car API:包含
CarHvacManager
和CarSensorManager
等 API。 -
CarService:位于
/platform/packages/services/Car/
。 -
VEHICLE HAL:用于定义 OEM 可以实现的车辆属性的接口。包含属性元数据(例如,车辆属性是否为 int 以及允许使用哪些更改模式)。位于
hardware/libhardware/include/hardware/vehicle.h
。(Android N - Android O) -
automotive - types.hal HIDL接口文件 位于
hardware/interfaces/automotive/vehicle/2.0/types.hal
,Android O之后改为HIDL架构,代替了上面的VEHICLE HAL -
Android N 7.0
新增
Car
架构,位于packages/services/Car
新增Vehicle hal
架构,位于hardware/libhardware/modules/vehicle
-
Android O 8.0
开始使用HIDL架构,新增types.hal定义,位于
hardware/interfaces/automotive/vehicle/2.0
新增
Car
的特性应用,位于packages/apps/Car
-
Android P 9.0
删除了
hardware/libhardware/modules/vehicle
库新增
CarLauncher
重构了
CarService
代码,注册Listener时会回调初始值重构
CarPropertyManager
,CarPropertyEventListener
->CarPropertyEventCallback
Car API接口和CarService子服务对应关系
Sdk | AIDL | Service |
---|---|---|
Car | ||
CarAudioManager | ICarAudio | CarAudioService |
CarAppFocusManager | IAppFocus | AppFocusService |
CarPackageManager | ICarPackageManager | CarPackageManagerService |
CarDiagnosticManager | ICarDiagnostic | CarDiagnosticService |
CarPowerManager | ICarPower | CarPowerManagementService |
CarProjectionManager | ICarProjection | CarProjectionService |
CarPropertyManager | ICarProperty | CarPropertyService |
CarBluetoothManager | ICarBluetooth | CarBluetoothService |
CarStorageMonitoringManager | ICarStorageMonitoring | CarStorageMonitoringService |
CarDrivingStateManager | ICarDrivingState | CarDrivingStateService |
CarUxRestrictionsManager | ICarUxRestrictionsManager | CarUxRestrictionsManagerService |
CarConfigurationManager | ICarConfigurationManager | CarConfigurationService |