当前位置: 首页 > article >正文

Android AutoMotive --CarService

1、AAOS概述

Android AutoMotive OS是谷歌针对车机使用场景打造的操作系统,它是基于现有Android系统的基础上增加了新特性,最主要的就是增加了CarService(汽车服务)模块。我们很容易把Android AutoMotiveAndroid 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;
}
}


http://www.kler.cn/a/516449.html

相关文章:

  • Unity编辑拓展显示自定义类型
  • 机器学习 vs 深度学习
  • 编程界“华山论剑”:PHP与Go,谁主沉浮?
  • 电子应用设计方案103:智能家庭AI浴缸系统设计
  • 困境如雾路难寻,心若清明步自轻---2024年创作回顾
  • 使用Redis缓解数据库压力+三种常见问题
  • SpringBoot如何自定义Starter ?
  • 【BUUCTF】[HITCON 2017]SSRFme1
  • 总结7。。
  • 指针生成网络(PGN)详细指南(引入)
  • 【橘子Kibana】Kibana的分析能力Analytics简易分析
  • mybatis-plus之使用lombok的@Builder注解之后的坑
  • selenium xpath定位一组元素中的某一个
  • 使用BitaHub部署DeepSeek-R1
  • malloc与new的比较
  • JAVA-快速排序
  • war包 | Docker部署flowable-ui
  • 《从入门到精通:蓝桥杯编程大赛知识点全攻略》(六)-分巧克力、K倍区间
  • 2000-2020年各省第二产业增加值数据
  • uniapp商城项目之创建启动(一)
  • Unity——鼠标是否在某个圆形Image范围内
  • Frida使用指南(三)
  • ThreeJS示例教程200+【目录】
  • 大数据学习(39)- Flink并行度
  • Springboot3 自动装配流程与核心文件:imports文件
  • machine learning knn算法之使用KNN对鸢尾花数据集进行分类