1、AAOS概述
Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统,它是基于现有Android系统的基础上增加了新特性,最主要的就是增加了CarService(汽车服务)模块。我们很容易把Android AutoMotive和Android Auto搞混,前者是基于源代码的扩展,是系统级的,编译后运行在车上的系统;而后者是谷歌推出的一款将手机内容投射到兼容的车机屏幕上的产品,主要的运算任务是在手机端,就类似于苹果的Carplay一样。
说回AAOS,其中的CarService是以独立APK的方式存在,使用system UID权限运行。总体关系如下:
2、CarService服务和API
Carservice内部包括了很多子服务,较为核心和常用的服务有:
服务名称 | 业务内容 |
---|---|
CarPropertyService | 汽车属性服务 |
CarAudioService | 汽车音频服务 |
CarPowerManagerService | 汽车电源管理服务 |
CarPackageMangerService | 汽车包管理服务 |
CarDrivingStateService | 汽车行驶状态服务 |
CarUxRestrictionsManagerService | 汽车限制规则服务,针对行车中视频的限制等 |
CarInputService | 汽车输入服务,针对车上的硬按键 |
当然,对于应用来说,是通过Car API的方式去调用以上的服务,这是典型的Android Binder通信机制的使用。API中以各种Manager的方式对外提供,主要包括:
API名称 | 业务内容 |
---|---|
CarPropertyManager | 汽车属性管理API |
CarInfoManager | 汽车信息管理API |
CarSensorManager | 传感器管理API |
CarHvacManager | 空调控制API |
CarCabinManager | 座舱控制API |
CarVendorExtentionManger | 外设管理API |
CarAudioManager | 车辆音频管理API |
CarPowerManager | 车辆电源管理API |
CarPackageManager | 车辆包管理API |
其中的CarInfoManager、CarSensorManager、CarHvacManager、CarCabinManager、CarVendorExtentionManger以及CarPropertyManager在服务端都是对应的CarPropertyService。但是在Android11中,CarInfoManager、CarSensorManager、CarHvacManager、CarCabinManager、等细分的Manager已经被标记为了过时的状态,谷歌还是建议大家直接使用CarPropertyManager去操作各个车辆的属性,这样能够更好地适应变化。
3、Car API的使用方式
应用使用Car API链接CarService对应的服务端,有两种方式,一种是传统的异步方式,一种是简化的同步方式。
3.1 异步方式:
首先通过Car.createCar创建Car对象:
Car mCar = Car.createCar(mContext, mServiceConnection);
并且还要主动调用Car的connect方法发起连接流程:
mCar.connect();
在连接上CarService之后,mServiceConnection会做回调:
private final ServiceConnection mServiceConnection = new ServiceConnection( ) {
@Override
public void onServiceConnected(CompenentName name, IBinder service) {
try {
mCarInfoManager =
(CarInfoManager) mCar.getCarManager(Car.INFO_SERVICE);
} catch(CarNotConnectedException e) {
LOG.e(“”,e);
}
}
}
@Override
Public void onServiceDeisconnected(ComponentName name) {
}
}
这里是用CarInfoManager做例子,其他的Manager也同样是这样的方式获取。
3.2 同步的方式:
这种方式,应用不必在连接并接收到回调之后才能使用Car API,可以直接同步获取,如下:
mCar = Car.createCar(this);
mCarInfoManager = (CarInfoManager) mCar.getCarManager(Car.INFO_SERVICE);
4、 CarService启动流程
CarService的启动流程流程和其他系统服务的类似,都是在开机的时候由SystemServer启动,不同的是CarService是运行在单独的进程,并且中间会有一个CarServiceHelperService做一个桥接,把位于单独仓库中的Carservice黏合进来,流程图如下:
CarService,在最新的Android14版本中,所有的工作已经交给CarServiceImpl完成。
在CarServiceImpl的onCreate方法中,会获取到HAL层的Vehicle的客户端对象,然后实例化ICarImpl,而在ICarImpl里面又会去初始化具体的各个服务,比如:
//packages/services/Car/service/src/com/android/car/ICarImpl.java
private ICarImpl(Builder builder) {
mCarPowerManagementService = constructWithTrace(
t, CarPowerManagementService.class,
() -> new CarPowerManagementService.Builder()
.setContext(mContext)
.setPowerHalService(mHal.getPowerHal())
.setSystemInterface(mSystemInterface)
.setCarUserService(mCarUserService)
.setPowerPolicyDaemon(builder.mPowerPolicyDaemon)
.setFeatureFlags(mFeatureFlags)
.build(),
allServices);
mCarPropertyService = constructWithTrace(
t, CarPropertyService.class,
() -> new CarPropertyService.Builder()
.setContext(mContext)
.setPropertyHalService(mHal.getPropertyHal())
.build(), allServices);
}
当客户端通过Car去获取对应Manager时,就会返回对应的服务:
// packages/services/Car/car-lib/src/android/car/Car.java
public Object getCarManager(String serviceName) {
IBinder binder = mService.getCarService(serviceName);
}
服务端对应:
//packages/services/Car/service/src/com/android/car/ICarImpl.java
public IBinder getCarService(String serviceName) {
switch (serviceName) {
case Car.AUDIO_SERVICE:
return mCarAudioService;
case Car.APP_FOCUS_SERVICE:
return mAppFocusService;
case Car.PACKAGE_SERVICE:
return mCarPackageManagerService;
case Car.POWER_SERVICE:
return mCarPowerManagementService;
case Car.CABIN_SERVICE:
case Car.HVAC_SERVICE:
case Car.INFO_SERVICE:
case Car.PROPERTY_SERVICE:
case Car.SENSOR_SERVICE:
case Car.VENDOR_EXTENSION_SERVICE:
return mCarPropertyService;
}
}