目录
三、车载的关键扩展点:SystemServer到CarService
2.CarServiceHelperService启动并绑定Carservice
[1.连接Vehicle HAL(重要修正点):](#1.连接Vehicle HAL(重要修正点):)
一、概述
在Android Automotive OS(AAOS)中,CarService是连接上层应用(Cars App/System UI)和底层车载硬件抽象层(Vehicle HAL,简称VHAL)的核心纽带。
与标准的Android系统对比,AAOS启动的主线骨架基本一致(Bootloader → Kernel → init → Zygote → SystemServer),但是在SystemServer初始化阶段引入了CarServiceHelperService(用于管理车载的核心服务),进而启动并管理运行在独立进程的CarService
二、Android系统启动回顾
Android系统从开机到展示的七个阶段:

三、车载的关键扩展点:SystemServer到CarService
AAOS在SystemServer阶段切入车载专用服务逻辑,为了保证系统核心服务的稳定性以及模块化升级,Google 在AAOS中采用**Updatable CarService(可更新车载服务)**架构
SystemServer 进程
│
├─► 检查 FEATURE_AUTOMOTIVE 特性
└─► 启动 CarServiceHelperService
│ (bindServiceAsUser)
▼
com.android.car 进程
│
└─► 运行 CarService
│
├─► 建立 AIDL VHAL 连接 (IVehicle)
├─► 创建 ICarImpl (管理子服务)
└─► 注册到 ServiceManager ("car_service")
1.SystemServer触发启动
在SystemServer的startOtherServices()方法中,系统会根据当前是否有车载特性(FEATURE_AUTOMOTIVE)进而判断是否启动车载相关服务:
java
// SystemServer.java
private void startOtherServices() {
// ...
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
t.traceBegin("StartCarServiceHelperService");
mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
t.traceEnd();
}
// ...
}
2.CarServiceHelperService启动并绑定Carservice
CarServiceHelperService是集成SystemService,由SystemServerManager通过反射实例化并调用onStart生命周期方法
在onStart()方法中通过bindServerAsUser以系统用户身份绑定并启动运行在独立进程(com.android.car)中的 CarService:
java
// CarServiceHelperService.java
public class CarServiceHelperService extends SystemService {
private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";
@Override
public void onStart() {
Intent intent = new Intent();
intent.setPackage("com.android.car");
intent.setAction(CAR_SERVICE_INTERFACE);
// 绑定并启动 com.android.car 进程中的 CarService
if (!getContext().bindServiceAsUser(
intent, mCarServiceConnection,
Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) {
Slog.wtf(TAG, "Cannot start car service");
}
// 加载车载 Helper JNI 库,提供底层 Hook 及原生能力支撑
System.loadLibrary("car-framework-service-jni");
}
}
四.CarService内部初始化生命流程
CarService被拉起后,会在onCreate()生命周期中完成与底层服务通信的建立、子服务创建以及Binder注册
1.连接Vehicle HAL(重要修正点):
⚠️ 源码修正与演进说明(从 HIDL 到 AIDL):
原文档涉及的 android.hardware.automotive.vehicle.V2_0.IVehicle 为 HIDL 接口(适用于 Android 12 及以前版本)。
从 Android 13/14 开始至 Android 16 ,AAOS 已全面迁移至 AIDL Vehicle HAL (android.hardware.automotive.vehicle.IVehicle)。HIDL VHAL 已被彻底废弃/移除。
Android 16获取VHAL的逻辑:
CarService通过ServiceManager通过标准流程获取AIDL Vehicle Binder 服务:
java
// CarService.java (最新 AIDL 规范)
@Nullable
private static IVehicle getVehicle() {
// 获取 AIDL VHAL 服务名称(默认: android.hardware.automotive.vehicle.IVehicle/default)
String instance = SystemProperties.get("ro.vehicle.hal", "default");
String serviceName = IVehicle.DESCRIPTOR + "/" + instance;
IBinder binder = ServiceManager.checkService(serviceName);
if (binder != null) {
return IVehicle.Stub.asInterface(binder);
}
Log.e(CarLog.TAG_SERVICE, "Failed to get IVehicle AIDL service: " + serviceName);
return null;
}
2.CarService中onCreate核心执行步骤
java
@Override
public void onCreate() {
Log.i(CarLog.TAG_SERVICE, "Service onCreate");
// 1. 获取 AIDL VHAL 句柄
mVehicle = getVehicle();
// 2. 构造车载综合接口实现类 ICarImpl
mICarImpl = new ICarImpl(
this,
mVehicle,
SystemInterface.Builder.defaultSystemInterface(this).build(),
mCanBusErrorNotifier,
// ...其他依赖参数
);
// 3. 执行 ICarImpl 的初始化(初始化各子服务与 VHAL 节点)
mICarImpl.init();
// 4. 将 ICar 接口注册到 ServiceManager,供应用层获取
ServiceManager.addService(Car.CAR_SERVICE, mICarImpl);
// 5. 设置 Boot 属性,通知系统车载服务初始化完成
SystemProperties.set("dev.bootcomplete", "1");
}
五、ICarImpl架构与子服务管理
ICarImpl是ICar.aidl接口的具体实现,本质上是车载所有子服务的总管家与路由器
1.ICarImpl构造方法:主要是各个子服务实例化
ICarImpl 在构造函数中统一创建 AAOS 包含的数十种核心子服务:
- CarPowerManagementService:电源状态与休眠/唤醒管理
- CarPropertyService:车辆属性读写(如车门、车窗、空调、续航等,是最核心的属性服务)
- CarAudioService:多音区音频路由与音量管理
- CarInputService:车辆按键以及旋钮输入事件处理
- CarUXRestrictionsService:行车安全/驾驶员注意力分散限制(UXR)
- CarWatchdongService:车载系统看门狗(监控进程cpu/闪存的健康度)
java
// ICarImpl.java
ICarImpl(Context serviceContext, IVehicle vehicle, ...) {
mContext = serviceContext;
mHal = new VehicleHal(vehicle); // 封装 AIDL VHAL 通信通道
// 创建各个核心子服务
mCarPropertyService = new CarPropertyService(mContext, mHal.getPropertyHal());
mCarPowerManagementService = new CarPowerManagementService(mContext, mHal.getPowerHal(), ...);
mCarAudioService = new CarAudioService(mContext, ...);
// 将子服务缓存至局域服务管理池,方便内部服务间互相获取
CarLocalServices.addService(CarPropertyService.class, mCarPropertyService);
CarLocalServices.addService(CarPowerManagementService.class, mCarPowerManagementService);
// ...
}
2.服务初始化与VHAL订阅(init)
在init阶段,正式完成服务的初始化过程以及与VHAL底层正式完成通信对接:
java
void init() {
// 1. 初始化 VehicleHal 建立属性映射表
mHal.init();
// 2. 依次调用各子服务的 init() 方法
mCarPropertyService.init();
mCarPowerManagementService.init();
mCarAudioService.init();
// ...
}
3.上层App调用车载子服务
当App通过Car.getCarManager(context, SERVICE_NAME),最终会跨进程调用到 ICarImpl.getCarService():
java
@Override
public IBinder getCarService(String serviceName) {
if (!mFeatureController.isFeatureEnabled(serviceName)) {
Log.w(CarLog.TAG_SERVICE, "getCarService for disabled service: " + serviceName);
return null;
}
switch (serviceName) {
case Car.AUDIO_SERVICE:
return mCarAudioService;
case Car.PROPERTY_SERVICE:
return mCarPropertyService;
case Car.POWER_SERVICE:
return mCarPowerManagementService;
// ...
default:
return null;
}
}
六.总结与主机厂实战架构演练
1.核心链路理清:
SystemServer仅拉起CarServiceHelperService;真正的CarService运行在com.android.car进程中,由CarServiceHelperService通过是否启用FEATURE_AUTOMOTIVE来进行CarService的绑定何启动流程
2.核心版本修订:
- 通信接口:已经从HIDL (V2_0.IVehicle)(Android12以及之前的版本)修改成AIDL (IVehicle)(Android 13~Android 16)
- 模块解耦:CarService运行在com.android.car的独立进程,即使崩溃也不会导致SystemServer崩溃而导致整个车机重启
3.主机厂(OEM)实际定制:
在许多量产车型中,为了降低协同开发的风险并提升服务稳定性,主机厂通常将CarAudioService或者CarPropertyService拆分成独立的服务,而CarService中某些简化架构中处于代理的角色或者专职处理CarPropertyService的角色