3. Android Automotive基础:CarService架构解析、Car API介绍、车载应用生命周期管理、系统权限模型
好,我们直接进入正题。Android Automotive 和手机上的 Android 到底差在哪?说白了,最大的区别就是多了一个叫 CarService 的东西。我刚开始接触 Automotive 时,第一反应是「这不就是 Android 吗?」结果一上手就发现,车辆相关的硬件控制、状态监听,全得通过 CarService 走。今天我们就把它拆开看看。
3.1 CarService 架构解析
CarService 是 Android Automotive 的核心服务。它运行在系统进程中,负责管理车辆硬件抽象层(VHAL)和所有车载相关的 API。你可以把它理解成一个「汽车硬件的中介」——应用不直接跟硬件打交道,而是通过 CarService 来间接控制。
核心架构分层:
- 应用层:你的车载 App,通过 Car API 与 CarService 通信。
- CarService 层:系统级服务,管理车辆状态、空调、车门、传感器等。
- VHAL 层:Vehicle Hardware Abstraction Layer,直接与车辆硬件交互。
我画了一张图,帮你把这三层的关系理清楚:
嗯,这里要注意:CarService 本身是一个 Android 系统服务,它通过 ICarService.aidl 暴露接口。应用通过 Car.createCar() 拿到 Car 对象,然后通过它获取各种子服务,比如 CarPropertyManager、CarSensorManager 等。
我的经验: 我在项目中遇到过一个问题——CarService 启动顺序跟车辆硬件初始化有关。如果 CarService 在 VHAL 还没准备好时就启动了,应用拿到的车辆状态全是默认值。我建议你在应用启动时加一个 CarConnectionCallback 监听,等 CarService 完全就绪后再操作。
3.2 Car API 介绍
Car API 是 Android Automotive 给应用开发者提供的「官方工具包」。它封装了车辆硬件的操作,让你不用关心底层 VHAL 的细节。说白了,你调一个 setTemperature(),背后 CarService 帮你跟空调硬件沟通。
常用的 Car API 有这些:
| API 名称 | 功能说明 | 典型使用场景 |
|---|---|---|
CarPropertyManager |
读写车辆属性(车速、里程、车门状态等) | 显示实时车速、车门未关提醒 |
CarSensorManager |
访问车辆传感器(GPS、加速度计、陀螺仪) | 导航、驾驶行为分析 |
CarHvacManager |
控制空调系统(温度、风量、模式) | 车载空调控制面板 |
CarAudioManager |
管理车载音频焦点和音量 | 音乐播放、导航语音播报 |
CarInfoManager |
获取车辆基本信息(品牌、型号、VIN) | 车辆信息展示页 |
举个例子,你想获取当前车速:
Car car = Car.createCar(context);
CarPropertyManager propertyManager = (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);
// 读取车速(单位:km/h)
float speed = propertyManager.getFloatProperty(
VehiclePropertyIds.PERF_VEHICLE_SPEED, 0);
你想想看,如果没有 Car API,你得自己去解析 CAN 总线数据,那工作量就大了去了。Google 把这些都封装好了,我们直接用就行。
注意: 不是所有车辆都支持所有属性。比如有些低配车没有胎压监测,你调 getProperty(TIRE_PRESSURE) 会返回 null 或抛出异常。我建议你每次读取前先检查 isPropertyAvailable()。
3.3 车载应用生命周期管理
车载应用的生命周期跟手机应用不太一样。最大的区别是:车载应用需要跟驾驶场景绑定。比如,当车辆行驶时,某些视频播放应用会被强制暂停或隐藏。
Android Automotive 引入了 驾驶模式(Driving Mode) 的概念。系统会根据车辆状态(P档、D档、R档)来管理应用的生命周期。
我记得有一次,我们做的视频播放器在车辆行驶时没有正确处理生命周期,结果用户在开车时还能看到视频画面——这显然不符合安全规范。后来我们加了一个 DrivingStateMonitor 监听,一旦检测到车辆行驶,立即暂停播放并切换到音频模式。
生命周期管理的关键点:
- 前台与后台:车载系统通常只有一个前台应用(地图或音乐),其他应用会被挂起。
- 驾驶模式切换:车辆从 P 档切换到 D 档时,系统会触发
onUserLeaveHint()或onStop()。 - 多窗口限制:很多车载系统不支持分屏,应用需要适配单窗口模式。
最佳实践: 在 onCreate() 中注册 CarDrivingStateManager 的监听器,在 onDestroy() 中注销。这样你的应用就能及时响应驾驶状态变化。
CarDrivingStateManager drivingStateManager =
(CarDrivingStateManager) car.getCarManager(Car.DRIVING_STATE_SERVICE);
drivingStateManager.registerListener(event -> {
if (event.getCurrentState() == CarDrivingStateEvent.DRIVING_STATE_MOVING) {
// 车辆行驶中,暂停视频、限制操作
pauseVideoPlayback();
showSimplifiedUI();
} else {
// 车辆静止,恢复完整功能
resumeVideoPlayback();
showFullUI();
}
});
3.4 系统权限模型
Android Automotive 的权限模型跟手机 Android 基本一致,但多了一些车载特有的权限。比如,你要读取车速、控制空调、访问车门状态,都需要声明对应的权限。
车载权限分为两类:
- 普通权限:安装时自动授予,比如
android.car.permission.CAR_INFO。 - 危险权限:需要运行时动态申请,比如
android.car.permission.CAR_CONTROL_AUDIO_VOLUME。
我整理了一个常用权限表:
| 权限名称 | 用途 | 权限级别 |
|---|---|---|
CAR_INFO |
读取车辆基本信息 | 普通 |
CAR_SPEED |
读取车速 | 危险 |
CAR_ENERGY |
读取电量/油量 | 危险 |
CAR_CONTROL_AUDIO_VOLUME |
控制音量 | 危险 |
CAR_CONTROL_HVAC |
控制空调 | 危险 |
为什么会这样设计?因为车速、空调这些涉及驾驶安全和隐私,不能随便让第三方应用访问。我曾经见过一个第三方应用,在后台偷偷读取车速数据上传到云端——这要是被用户发现,直接就是隐私事故。
避坑指南: 动态申请权限时,记得处理用户拒绝的情况。车载系统上用户可能正在开车,没空仔细看权限弹窗就直接点了「拒绝」。我建议你在申请权限前先弹一个说明对话框,告诉用户为什么需要这个权限。
// 动态申请车速权限
if (checkSelfPermission(Manifest.car.permission.CAR_SPEED)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(
new String[]{Manifest.car.permission.CAR_SPEED},
REQUEST_CODE_CAR_SPEED
);
}
嗯,到这里,Android Automotive 的基础部分就讲得差不多了。CarService 是骨架,Car API 是工具,生命周期和权限是规矩。把这四个点吃透了,你写车载应用时就不会手忙脚乱。
公众号:蓝海资料掘金营,微信deep3321