深入解析 Android Automotive (AAOS) 启动流程与 CarService 核心机制(基于 Android 16 最新源码视角)

目录

一、概述

二、Android系统启动回顾

三、车载的关键扩展点:SystemServer到CarService

1.SystemServer触发启动

2.CarServiceHelperService启动并绑定Carservice

四.CarService内部初始化生命流程

[1.连接Vehicle HAL(重要修正点):](#1.连接Vehicle HAL(重要修正点):)

2.CarService中onCreate核心执行步骤

五、ICarImpl架构与子服务管理

1.ICarImpl构造方法:主要是各个子服务实例化

2.服务初始化与VHAL订阅(init)

3.上层App调用车载子服务

六.总结与主机厂实战架构演练

1.核心链路理清:

2.核心版本修订:

3.主机厂(OEM)实际定制:


一、概述

在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的角色

相关推荐
rosmis1 小时前
agent各指标定义
android·java·开发语言
风样滴男人哟3 小时前
PHP特性之反射类ReflectionClass机制
android·开发语言·php
小孔龙3 小时前
RenderNode 与 DisplayList:Android 硬件加速的绘制记录与复用
android·性能优化
qizayaoshuap4 小时前
鸿蒙 ArkTS 实战:搜索列表 城市实时过滤(示例 94)
android·华为·harmonyos
朝星4 小时前
Framework筑基之Handler消息机制5(应用层)
android
2601_965798474 小时前
ForumLab Review: Fast PHP Script for SEO Forum Sites
android·adb·php
LUCKY-LIVING5 小时前
ELF File in linux
android·java·linux
xqqxqxxq5 小时前
SQL 字段约束笔记
android·笔记·sql
深念Y5 小时前
技术探索记录 在 Android 手机上运行 One API
android·linux·服务器·智能手机·go·交叉编译·服务