1. 车载Android开发环境搭建与首个应用
任务目标
本案例面向车载Android应用开发者,目标是建立对车载Android系统整体架构的清晰认知,明确应用开发者所处的层级位置、上下层依赖关系以及各层核心职责。完成本案例后,应能独立绘制并解释车载Android系统的分层架构图。
车载Android系统分层架构
车载Android系统在标准Android架构基础上,针对车辆场景增加了车机特有的硬件抽象与服务。从下至上分为四层:
- Linux内核层:基础驱动与安全隔离,包含车载专用驱动(CAN、车载以太网)与内核安全模块。
- 硬件抽象层(HAL):通过标准化接口屏蔽硬件差异。车载特有HAL包括
Vehicle HAL(车辆属性访问)、Audio HAL(音频焦点与路由)、Camera HAL(车载摄像头)。 - 系统服务层:核心服务运行于独立进程。车载特有服务为
CarService,聚合Vehicle HAL并向上层提供CarPropertyManager等API;同时包含标准服务(ActivityManager、WindowManager、AudioService)。 - 应用框架层:提供SDK API与系统UI。车载应用通过
android.car.*API访问车辆功能,系统UI包含车机桌面(Launcher)、状态栏与车辆设置。
架构图
下图展示了车载Android系统的分层结构、核心组件及跨层调用路径(以应用读取车辆速度为例):
关键代码:读取车辆速度的跨层调用
以下代码演示了应用层通过标准API访问车辆属性的最小闭环,验证了架构图中应用 → CarService → Vehicle HAL的调用路径:
// 1. 在AndroidManifest.xml中声明权限(仅示意,需在工程中配置)
// <uses-permission android:name="android.car.permission.CAR_SPEED" />
// 2. 应用层代码:获取CarPropertyManager并读取速度
import android.car.Car;
import android.car.VehiclePropertyIds;
import android.car.hardware.property.CarPropertyManager;
import android.content.Context;
public class SpeedReader {
private Car mCar;
private CarPropertyManager mCarPropertyManager;
public void init(Context context) {
mCar = Car.createCar(context, /* handler= */ null, /* callback= */ null);
mCarPropertyManager = (CarPropertyManager) mCar.getCarManager(Car.PROPERTY_SERVICE);
}
/** 读取当前车速(单位:m/s),失败返回null */
public Float readSpeed() {
try {
CarPropertyManager.CarPropertyValue<Float> value =
mCarPropertyManager.getProperty(
VehiclePropertyIds.PERF_VEHICLE_SPEED, 0);
return value != null ? value.getValue() : null;
} catch (Exception e) {
return null; // 权限不足或属性不可用时返回null
}
}
public void release() {
if (mCar != null) {
mCar.disconnect();
}
}
}
运行与验证
运行环境:Android Studio 4.2+,编译SDK 30+,需连接车载模拟器(AAOS模拟器)或实车。在build.gradle中添加依赖:
implementation "androidx.car.app:app-automotive:1.2.0"
验证步骤:
- 在AAOS模拟器中启动应用,调用
init()后调用readSpeed()。 - 通过模拟器控制台发送模拟车速:
adb shell cmd car_service set-vehicle-property PERF_VEHICLE_SPEED --float 15.0。 - 观察应用日志或界面显示:若返回约15.0(m/s),说明应用→CarService→Vehicle HAL链路正常。
- 通过条件:成功读取到与模拟设置一致的速度值(误差±0.5 m/s),且无
SecurityException或CarNotConnectedException。
常见问题:若返回null,优先检查AndroidManifest.xml中是否声明了android.car.permission.CAR_SPEED权限,以及应用是否已加入android.car.CAR_PERMISSION系统权限组(调试时可通过adb shell pm grant授权)。