Android AutoMotive --CarService

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对象:

java 复制代码
Car mCar = Car.createCar(mContext, mServiceConnection);

并且还要主动调用Car的connect方法发起连接流程:

java 复制代码
mCar.connect();

在连接上CarService之后,mServiceConnection会做回调:

java 复制代码
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,可以直接同步获取,如下:

java 复制代码
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里面又会去初始化具体的各个服务,比如:

java 复制代码
//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时,就会返回对应的服务:

java 复制代码
// packages/services/Car/car-lib/src/android/car/Car.java
public Object getCarManager(String serviceName) {
	IBinder binder = mService.getCarService(serviceName);
}

服务端对应:

java 复制代码
//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;
}
}
相关推荐
江上清风山间明月几秒前
Flutter开发的应用页面非常多时如何高效管理路由
android·flutter·路由·页面管理·routes·ongenerateroute
子非衣4 小时前
MySQL修改JSON格式数据示例
android·mysql·json
openinstall全渠道统计7 小时前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
双鱼大猫7 小时前
一句话说透Android里面的ServiceManager的注册服务
android
双鱼大猫7 小时前
一句话说透Android里面的查找服务
android
双鱼大猫7 小时前
一句话说透Android里面的SystemServer进程的作用
android
双鱼大猫7 小时前
一句话说透Android里面的View的绘制流程和实现原理
android
双鱼大猫8 小时前
一句话说透Android里面的Window的内部机制
android
双鱼大猫8 小时前
一句话说透Android里面的为什么要设计Window?
android
双鱼大猫8 小时前
一句话说透Android里面的主线程创建时机,frameworks层面分析
android