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;
}
}
相关推荐
古法安卓6 小时前
Android-SELinux 策略调试实战:从 AVC 日志到策略修复
android·java·android studio
Dovis(誓平步青云)7 小时前
DevEco Studio 6.1.1 Windows 安装实录:从下载校验到首次启动
android·开发语言·数据库·人工智能·windows·harmonyos
Zender Han7 小时前
Flutter 自适应(Adaptive)与响应式(Responsive)设计实践:官方推荐方案详解
android·flutter·ios
我命由我123457 小时前
Android 开发问题:TopAppBar 和 topAppBarColors API is experimental...
android·java·java-ee·kotlin·android studio·android jetpack·android-studio
造火箭8 小时前
Android UI自动化测试可行性评估SKILL
android·功能测试·ui
hunterandroid9 小时前
[Android 从零到一] ViewPager2 与 Fragment 生命周期协同:从预加载到状态一致性
android·前端
mmsx10 小时前
一个黑边 Bug 修了两版:自己算矩阵直接黑屏,借库重建只用了一行 setZoom
android·前端
枢影Kernel10 小时前
Android CLI 与 Android Skills 最佳实践:把 AI Agent 接入可验证的 Android 开发流程
android
Kapaseker11 小时前
没想到吧!Skill 也可以测试 — 小白都看得懂的 Skill 教程
android·人工智能·kotlin
我命由我1234511 小时前
Android 开发问题:使用 AndroidTreeView 时,自定义视图无法撑满父容器
android·java·java-ee·kotlin·android studio·android-studio·android runtime