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;
}
}
相关推荐
游戏开发爱好者82 小时前
日常开发与测试的 App 测试方法、查看设备状态、实时日志、应用数据
android·ios·小程序·https·uni-app·iphone·webview
王码码20352 小时前
Flutter for OpenHarmony 实战之基础组件:第三十一篇 Chip 系列组件 — 灵活的标签化交互
android·flutter·交互·harmonyos
黑码哥2 小时前
ViewHolder设计模式深度剖析:iOS开发者掌握Android列表性能优化的实战指南
android·ios·性能优化·跨平台开发·viewholder
亓才孓2 小时前
[JDBC]元数据
android
独行soc2 小时前
2026年渗透测试面试题总结-17(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
金融RPA机器人丨实在智能2 小时前
Android Studio开发App项目进入AI深水区:实在智能Agent引领无代码交互革命
android·人工智能·ai·android studio
科技块儿2 小时前
利用IP查询在智慧城市交通信号系统中的应用探索
android·tcp/ip·智慧城市
独行soc3 小时前
2026年渗透测试面试题总结-18(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
2501_915106323 小时前
app 上架过程,安装包准备、证书与描述文件管理、安装测试、上传
android·ios·小程序·https·uni-app·iphone·webview