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;
}
}
相关推荐
小趴菜82274 小时前
安卓接入Kwai广告源
android·kotlin
2501_916013745 小时前
iOS 混淆与 App Store 审核兼容性 避免被拒的策略与实战流程(iOS 混淆、ipa 加固、上架合规)
android·ios·小程序·https·uni-app·iphone·webview
程序员江同学6 小时前
Kotlin 技术月报 | 2025 年 9 月
android·kotlin
码农的小菜园6 小时前
探究ContentProvider(一)
android
时光少年8 小时前
Compose AnnotatedString实现Html样式解析
android·前端
hnlgzb8 小时前
安卓中,kotlin如何写app界面?
android·开发语言·kotlin
jzlhll1239 小时前
deepseek kotlin flow快生产者和慢消费者解决策略
android·kotlin
火柴就是我9 小时前
Android 事件分发之动态的决定某个View来处理事件
android
一直向钱9 小时前
FileProvider 配置必须针对 Android 7.0+(API 24+)做兼容
android
zh_xuan9 小时前
Android 消息循环机制
android