第4章:车载服务层(Car Service)——CarService架构、核心API、服务注册与发现

好,咱们进入车载系统的核心地带了。

CarService,说白了就是车载Android系统的“大脑中枢”。你想想看,车上的硬件那么多——空调、车窗、方向盘、传感器……每个都直接跟系统打交道?那不乱套了。CarService就是那个统一调度、统一管理的角色。

4.1 CarService的整体架构

我习惯把CarService理解成一个“服务大管家”。它运行在系统进程中,负责管理所有车载相关的硬件服务。

它的架构大致分三层:

  • 底层:通过HAL(硬件抽象层)与硬件通信。比如空调的冷暖风、车窗的升降电机,都通过HAL接口控制。
  • 中间层:CarService本身。它封装了各种Manager(如CarClimateManager、CarWindowManager),对外提供统一的API。
  • 上层:应用层。车载应用通过bindService的方式绑定到CarService,然后调用Manager接口。

嗯,这里要注意一点:CarService是单例的,整个系统只有一个实例。我在项目中遇到过有人试图多次启动CarService,结果导致服务冲突,系统直接崩溃。所以,千万别这么干。

4.2 核心API:CarManager体系

CarService暴露给应用层的核心,就是CarManager。它其实是一个抽象类,具体实现由各个子Manager完成。

常用的Manager有这些:

Manager名称 功能说明
CarClimateManager 控制空调温度、风量、风向等
CarWindowManager 控制车窗升降、天窗开关
CarSensorManager 获取车速、油耗、胎压等传感器数据
CarAudioManager 管理车载音频焦点、音量、音区
CarHvacManager 暖通空调系统控制(部分车型独立)

举个例子,你想让应用控制空调温度,代码大概是这样:

// 绑定CarService
Car car = Car.createCar(context);
car.connect();

// 获取空调Manager
CarClimateManager climateManager = (CarClimateManager) car.getCarManager(Car.CLIMATE_SERVICE);

// 设置温度25度
climateManager.setTemperature(CarClimateManager.ZONE_DRIVER, 25.0f);

我个人习惯在onCreate里就绑定CarService,但要注意异步回调。我曾经踩过一个坑:在绑定完成前就调用Manager方法,结果返回null。所以一定要在onServiceConnected回调里操作。

4.3 服务注册与发现机制

CarService怎么知道有哪些服务可用?这就涉及到服务注册与发现了。

其实原理很简单:每个车载硬件服务在启动时,会向CarService注册自己。CarService维护一个服务列表,应用通过Manager名称来查找对应的服务。

注册流程大致如下:

  1. 硬件服务(如ClimateService)继承自CarServiceBase。
  2. 在系统启动时,CarService读取配置文件(通常是car_config.xml),知道要加载哪些服务。
  3. CarService通过反射或直接实例化,创建这些服务对象。
  4. 服务对象调用registerService()方法,把自己注册到CarService的服务注册表中。

服务发现就更直接了:应用调用car.getCarManager(Car.CLIMATE_SERVICE)时,CarService根据传入的字符串,从注册表里找到对应的Binder对象,返回给应用。

核心要点:服务注册表本质是一个Map<String, IBinder>。Key是服务名称,Value是Binder代理。所以服务名称必须唯一,不能重复。

4.4 避坑指南:服务注册的常见问题

我曾经遇到过一个问题:自定义服务注册后,应用一直找不到。排查了半天,发现是服务名称写错了大小写。CarService的服务名称是大小写敏感的,比如"climate"和"Climate"是两个不同的服务。

另外,服务注册的顺序也有讲究。我建议把核心服务(如电源管理、传感器)放在前面注册,次要服务(如氛围灯、座椅按摩)放在后面。因为CarService启动时是顺序加载的,如果某个服务注册失败,会影响后续服务的加载。

小技巧:你可以在car_config.xml里配置服务的启动级别。比如:

<service name="climate" class="com.android.car.climate.ClimateService" level="critical"/>
<service name="ambient_light" class="com.android.car.light.AmbientLightService" level="normal"/>

critical级别的服务如果启动失败,CarService会直接报错退出。normal级别的服务失败,只会打印警告,不影响其他服务。

4.5 总结一下

CarService的架构其实不复杂,但细节很多。你只要记住三点:

  • CarService是单例的服务大管家,管理所有车载硬件。
  • 应用通过CarManager体系与硬件交互,不要直接操作Binder。
  • 服务注册与发现基于Map实现,名称唯一、大小写敏感。

嗯,这一章就到这里。下一章咱们聊聊车载电源管理,那可是个容易出bug的地方。