3. AAOS 核心组件:System UI、Car Launcher、Car Settings、Car Service 等核心系统应用介绍

Android Automotive OS (AAOS) 的架构围绕车载环境进行了深度定制。与手机 Android 不同,AAOS 将多个核心系统应用作为车辆交互的入口。本章将深入剖析 System UI、Car Launcher、Car Settings 和 Car Service 这四大核心组件的职责、架构关系及关键技术细节。

核心认知: 在 AAOS 中,System UI 负责系统级视觉与交互框架,Car Launcher 是用户主入口,Car Settings 提供车辆专属配置,而 Car Service 则是连接应用层与车辆硬件的桥梁。理解这四者的协作关系是掌握 AAOS 架构的关键。

3.1 核心组件架构总览

下图展示了 AAOS 核心系统应用在系统架构中的位置及其相互依赖关系。Car Service 作为系统服务运行在 System Server 进程中,而 System UI、Car Launcher 和 Car Settings 则作为普通应用运行,通过 Binder IPC 与 Car Service 通信。

AAOS 核心组件架构关系图 AAOS 核心组件架构关系图 应用层 (System Apps) System UI 状态栏 / 导航栏 / 通知 Car Launcher 主屏幕 / 应用抽屉 Car Settings 车辆专属设置 系统服务层 (System Services) Car Service (System Server) Vehicle HAL / Property 管理 Binder IPC Binder IPC Binder IPC 说明: • System UI、Car Launcher、Car Settings 均为普通应用进程,拥有独立的 UID 和权限。 • Car Service 运行在 System Server 中,是系统级服务,负责与 Vehicle HAL 直接交互。 • 所有应用通过 @CarApi 注解生成的 Binder 桩代码与 Car Service 通信。

3.2 System UI:车载系统的视觉框架

System UI 是 AAOS 中负责系统级用户界面元素的进程。它管理着驾驶场景下最关键的可视化交互区域,确保驾驶员能够安全、高效地获取信息和进行操作。

3.2.1 核心职责

  • 状态栏 (Status Bar): 显示时间、网络信号、蓝牙连接、电量等系统状态图标。在车载场景下,还会显示空调温度、驾驶模式等车辆专属状态。
  • 导航栏 (Navigation Bar): 提供返回、主屏幕、最近应用等系统导航操作。AAOS 支持手势导航和传统三键导航。
  • 通知面板 (Notification Panel): 管理来自应用和系统的通知,支持快速设置开关(如 Wi-Fi、蓝牙、驾驶模式)。
  • 系统对话框 (System Dialogs): 处理权限请求、系统警告、音量调节等模态交互。

3.2.2 关键技术点

技术维度 说明
进程模型 运行在 com.android.systemui 进程中,属于系统级应用,拥有 system 级别的 UID。
启动方式 由 System Server 在系统启动早期通过 startSystemUi() 方法显式启动,确保在 Launcher 启动前完成初始化。
窗口层级 System UI 的窗口类型为 TYPE_STATUS_BAR、TYPE_NAVIGATION_BAR 等系统级窗口,拥有最高的 Z-order。
车辆集成 通过 CarServiceManager 监听车辆状态变化(如车速、车门状态),并动态更新 UI 元素。
架构要点: System UI 是 AAOS 中唯一可以覆盖在所有应用之上的系统界面。它通过 WindowManagerService 管理窗口层级,确保关键信息(如导航提示、来电通知)始终可见,同时避免遮挡驾驶安全相关的显示区域。

3.3 Car Launcher:车载主屏幕

Car Launcher 是用户进入车辆系统后看到的第一个应用。它不仅是应用启动器,更是驾驶场景下的信息聚合中心。

3.3.1 核心功能模块

  • 主屏幕 (Home Screen): 显示导航卡片、媒体播放控件、快捷应用图标等。卡片内容通常由 CarService 提供的车辆数据驱动。
  • 应用抽屉 (App Drawer): 列出所有已安装且允许在驾驶时使用的应用。AAOS 通过 Distraction Optimization 机制过滤不适合驾驶时操作的应用。
  • 任务栏 (Taskbar): 在宽屏或横屏模式下,显示最近使用的应用和固定应用,支持快速切换。

3.3.2 与手机 Launcher 的关键差异

对比维度 手机 Launcher Car Launcher
交互模式 触摸为主,支持多点触控 触摸 + 旋钮 + 语音,强调单手操作
内容优先级 应用图标、Widget 导航、媒体、车辆信息卡片
安全限制 无驾驶安全限制 受 Distraction Optimization 约束,限制复杂交互
多用户支持 支持多用户切换 支持驾驶员档案 (Driver Profile) 切换
安全设计注意: Car Launcher 必须实现 IDistractionOptimizationCallback 接口,根据车辆行驶状态动态调整 UI 复杂度。例如,当车速超过 5 km/h 时,应禁用列表滚动和键盘输入等高风险交互。

3.4 Car Settings:车辆专属设置中心

Car Settings 是 AAOS 中管理车辆相关配置的系统应用。它扩展了 Android 原生 Settings 应用,增加了大量与车辆硬件和驾驶体验相关的设置项。

3.4.1 设置项分类

  • 车辆控制: 灯光、门锁、车窗、后视镜调节等。
  • 驾驶辅助: 车道保持、自适应巡航、泊车辅助等 ADAS 功能开关。
  • 舒适性: 座椅加热/通风、方向盘加热、氛围灯颜色等。
  • 系统偏好: 驾驶模式(运动/舒适/经济)、语音唤醒词、导航偏好等。

3.4.2 架构实现

Car Settings 通过 CarPropertyManager 与 Car Service 交互,读取和写入车辆属性 (Vehicle Property)。每个设置项对应一个或多个 Vehicle Property ID。

// 示例:读取车内温度设置
CarPropertyManager propertyManager = 
    (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);
try {
    // 读取 HVAC 温度设定值
    FloatProperty<Float> tempProperty = 
        new FloatProperty<>(VehiclePropertyIds.HVAC_TEMPERATURE_SET, 0);
    float currentTemp = propertyManager.getProperty(tempProperty, 0);
    // 更新 UI
    updateTemperatureDisplay(currentTemp);
} catch (CarNotConnectedException e) {
    Log.e("CarSettings", "Car service not connected", e);
}

3.5 Car Service:车辆硬件抽象中枢

Car Service 是 AAOS 中连接 Android 框架与车辆硬件的核心系统服务。它运行在 System Server 进程中,作为所有车辆相关 API 的注册中心和调度中心。

3.5.1 核心架构层次

Car Service 内部架构层次图 Car Service 内部架构层次图 应用层 (System UI / Launcher / Settings / 第三方 App) Binder IPC 层 (@CarApi 注解生成的桩代码) Car Service 核心 (System Server 进程) CarPropertyManager / CarAudioManager / CarHvacManager / CarNavigationManager 权限管理 / 订阅管理 / 属性缓存 / 策略引擎 Vehicle HAL (VHAL) — 硬件抽象层 VHAL 通过 HIDL / AIDL 接口与 Car Service 通信,具体实现由 OEM 在硬件层完成。

3.5.2 关键服务组件

服务名称 管理类 核心功能
Property Service CarPropertyManager 管理所有车辆属性(车速、里程、车门状态等)的读写和订阅。
Audio Service CarAudioManager 管理车载音频焦点、音量分组、音频路由(导航/媒体/电话/提示音)。
HVAC Service CarHvacManager 控制空调温度、风量、风向、座椅加热等舒适性功能。
Navigation Service CarNavigationManager 管理导航状态、转弯提示、仪表盘导航信息投射。
Diagnostic Service CarDiagnosticManager 提供车辆诊断信息(故障码、传感器数据)。

3.5.3 属性订阅机制

Car Service 采用 发布-订阅 (Pub-Sub) 模式管理车辆属性变化。应用通过 CarPropertyManager.registerCallback() 注册监听器,当 VHAL 上报属性变化时,Car Service 负责将事件分发给所有已注册的订阅者。

// 订阅车速变化
CarPropertyManager propertyManager = 
    (CarPropertyManager) car.getCarManager(Car.PROPERTY_SERVICE);
propertyManager.registerCallback(
    new CarPropertyManager.CarPropertyEventCallback() {
        @Override
        public void onChangeEvent(CarPropertyValue value) {
            if (value.getPropertyId() == VehiclePropertyIds.PERF_VEHICLE_SPEED) {
                float speed = (float) value.getValue();
                updateSpeedDisplay(speed);
                // 根据车速调整 UI 安全策略
                if (speed > 5.0f) {
                    enableDistractionOptimization(true);
                }
            }
        }
        @Override
        public void onErrorEvent(int propertyId, int zone) {
            Log.w("CarDemo", "Error on property: " + propertyId);
        }
    },
    VehiclePropertyIds.PERF_VEHICLE_SPEED,
    CarPropertyManager.SENSOR_RATE_NORMAL
);
性能优化建议: 高频属性(如车速、转速)建议使用 SENSOR_RATE_NORMAL 或 SENSOR_RATE_FAST 模式,低频属性(如车门状态)使用 SENSOR_RATE_ONCHANGE 模式,以减少 Binder 调用开销和 CPU 唤醒次数。

3.6 组件协作流程示例

以下是一个典型的用户操作流程,展示四个核心组件如何协同工作:

  1. 用户操作: 在 Car Launcher 主屏幕上点击“空调”快捷图标。
  2. Launcher 处理: Car Launcher 通过 Intent 启动 Car Settings 的空调设置页面。
  3. Settings 读取数据: Car Settings 通过 CarHvacManager 向 Car Service 请求当前空调温度。
  4. Car Service 响应: Car Service 从 VHAL 获取 HVAC 属性值,返回给 Car Settings。
  5. 用户调节温度: 用户在 Settings 界面滑动温度条。
  6. Settings 写入数据: Car Settings 调用 CarHvacManager.setTemperature() 将新温度值写入 Car Service。
  7. Car Service 下发: Car Service 将属性变化写入 VHAL,硬件执行温度调节。
  8. System UI 更新: Car Service 将温度变化事件广播给所有订阅者,System UI 收到通知后更新状态栏中的温度显示。
架构总结: AAOS 通过将 System UI、Car Launcher、Car Settings 作为独立应用,与 Car Service 系统服务解耦,实现了清晰的关注点分离。Car Service 作为唯一的车辆硬件访问入口,确保了安全性和权限一致性;而前端应用则可以根据 OEM 需求进行深度定制,同时保持与底层硬件的稳定接口。