Appearance
车载鸿蒙
1. 车载鸿蒙概述
1.1 HarmonyOS for Automotive
HarmonyOS for Automotive 架构:
┌─────────────────────────────────────────────────┐
│ 车载鸿蒙应用层 │
│ ├── 车机应用(导航/音乐/通讯) │
│ ├── 座舱 HMI(仪表盘/中控/后屏) │
│ └── 第三方应用(游戏/办公/影音) │
├─────────────────────────────────────────────────┤
│ 车载框架层 │
│ ├── ArkUI(座舱 UI 框架) │
│ ├── 车载框架 API(车辆控制/传感器/通信) │
│ ├── 分布式能力(手机-车机协同) │
│ └── AI 能力(语音/视觉/导航) │
├─────────────────────────────────────────────────┤
│ 车载中间件 │
│ ├── 车载系统服务(电源/空调/车窗) │
│ ├── 车载安全(ADAS/安全域隔离) │
│ ├── OTA 升级(空中下载) │
│ └── 多域融合(座舱域/智驾域/车身域) │
├──────────────────────────────────────────────────┤
│ 车载内核/驱动 │
│ ├── HongMeng Kernel(车载实时内核) │
│ ├── HDF 车载驱动(传感器/执行器) │
│ └── 车载通信(车载以太网/车载 CAN) │
└─────────────────────────────────────────────────┘1.2 车载鸿蒙 vs Android Auto/CarPlay
| 维度 | 车载鸿蒙 | Android Auto | CarPlay |
|---|---|---|---|
| 架构 | 原生车载系统 | 手机投屏 | 手机投屏 |
| 深度集成 | 车辆 API 直接集成 | 有限 API | 有限 API |
| 自定义 | 高度自定义 HMI | 固定 UI 模板 | 固定 UI 模板 |
| 性能 | 原生应用,高性能 | 受限于手机性能 | 受限于手机性能 |
| 离线能力 | 完全离线可用 | 依赖手机网络 | 依赖手机网络 |
| 车机厂商 | OEM 深度定制 | 第三方适配 | 第三方适配 |
| AI 集成 | 小艺车载 | Google AI | Siri |
| 生态 | 鸿蒙生态(元服务) | Google 生态 | Apple 生态 |
2. 车机应用开发
2.1 车载应用模型
车机应用模型:
┌─────────────────────────────────────────────────────┐
│ UIAbility(车机页面入口) │
│ ├── 仪表盘页面 │
│ ├── 中控页面 │
│ ├── 后屏页面 │
│ └── HUD 页面 │
├─────────────────────────────────────────────────────┤
│ 车载 ExtensionAbility │
│ ├── VehicleExtensionAbility(车辆控制) │
│ ├── AudioExtensionAbility(音频管理) │
│ ├── NavigationExtensionAbility(导航管理) │
│ └── DisplayExtensionAbility(显示管理) │
└─────────────────────────────────────────────────────┘2.2 车载 UI 开发
arkts
// 车机仪表盘组件
@Entry
@Component
struct Dashboard {
@State speed: number = 0;
@State battery: number = 85;
@State navigation: NavigationInfo = new NavigationInfo();
build() {
Row() {
// 左侧速度表
Speedometer({ speed: this.speed })
.width(280)
.height(280)
// 中间导航信息
Column() {
NavigationInfo({
destination: this.navigation.destination,
eta: this.navigation.eta,
distance: this.navigation.distance
})
}
.width('40%')
.height('100%')
// 右侧状态卡片
Column() {
StateCard({ title: '电量', value: this.battery + '%', icon: '🔋' })
StateCard({ title: '里程', value: '12,580', icon: '🚗' })
StateCard({ title: '温度', value: '24°C', icon: '🌡️' })
}
.width(200)
.height('100%')
}
.width('100%')
.height('100%')
.backgroundColor('#1a1a2e')
}
}
// 速度表组件
@Component
struct Speedometer {
@Prop speed: number = 0;
build() {
Column() {
// 圆形速度显示
Canvas((ctx: CanvasRenderingContext2D) => {
// 绘制速度圆环
ctx.beginPath();
ctx.arc(140, 140, 100, -Math.PI / 2, -Math.PI / 2 + (this.speed / 200) * Math.PI * 2);
ctx.lineWidth = 20;
ctx.strokeStyle = this.speed > 120 ? '#ff4444' : '#4488ff';
ctx.stroke();
// 绘制速度数值
ctx.fillStyle = '#ffffff';
ctx.font = '48px Arial';
ctx.textAlign = 'center';
ctx.fillText(String(this.speed), 140, 160);
ctx.font = '16px Arial';
ctx.fillText('km/h', 140, 185);
})
.width(280)
.height(280)
.borderRadius(140)
}
}
}2.3 车载传感器接入
arkts
// 车载传感器数据接入
import { vehicleSensor } from '@kit.VehicleKit';
class VehicleSensorService {
private speedSubscription: number = 0;
private batterySubscription: number = 0;
async initSensors() {
// 订阅车速
this.speedSubscription = await vehicleSensor.subscribe(
vehicleSensor.SensorType.SPEED,
(data: vehicleSensor.SensorData) => {
console.log(`Speed: ${data.value} km/h`);
}
);
// 订阅电量
this.batterySubscription = await vehicleSensor.subscribe(
vehicleSensor.SensorType.BATTERY_LEVEL,
(data: vehicleSensor.SensorData) => {
console.log(`Battery: ${data.value}%`);
}
);
}
async unsubscribe() {
await vehicleSensor.unsubscribe(this.speedSubscription);
await vehicleSensor.unsubscribe(this.batterySubscription);
}
}2.4 车机与手机协同
arkts
// 车机与手机分布式协同
import { distributedAbility } from '@kit.DistributedKit';
// 1. 手机 → 车机:导航投屏
async function castToCar(phoneUri: string) {
const carDevices = await distributedAbility.getCarDevices();
if (carDevices.length > 0) {
await distributedAbility.castAbility({
fromApp: phoneUri,
toDevice: carDevices[0].deviceId,
type: distributedAbility.CastType.NAVIGATION
});
}
}
// 2. 车机 → 手机:音乐续播
async function musicContinuity() {
const phone = await distributedAbility.findPhoneDevice();
if (phone) {
await distributedAbility.transferAbility({
fromDevice: 'car',
toDevice: phone.deviceId,
want: {
bundleName: 'com.example.music',
abilityName: 'MusicAbility'
}
});
}
}
// 3. 手机 → 车机:日历同步
async function syncCalendar() {
await distributedAbility.syncData({
dataType: 'calendar',
deviceId: 'car-device-id'
});
}3. 车载 HMI 设计
3.1 车载 HMI 设计原则
车载 HMI 设计原则:
├── 安全优先:驾驶时减少分心,关键信息一目了然
├── 简洁布局:信息密度适中,避免信息过载
├── 大图标/大字体:驾驶中需远距离识别
├── 语音优先:关键操作通过语音完成
├── 暗色主题:减少驾驶时的屏幕眩光
├── 实时反馈:操作后立即显示反馈
├── 断网可用:离线场景核心功能可用
└── 多屏协同:仪表盘/中控/后屏/HUD 协同3.2 多屏协同
多屏协同架构:
┌──────────────┐ ┌──────────────────┐ ┌──────────────┐
│ 仪表盘 │ │ 中控屏 │ │ 后屏 │
│ (驾驶信息) │──│ (导航/多媒体) │──│ (娱乐/控制) │
│ │ │ │ │ │
│ 速度/转速 │ │ 导航 │ │ 视频 │
│ 电量/里程 │ │ 音乐 │ │ 空调控制 │
│ 驾驶辅助 │ │ 电话 │ │ 座椅控制 │
│ 警示信息 │ │ 设置 │ │ 后排娱乐 │
└──────────────┘ └──────────────────┘ └──────────────┘
多屏协同能力:
├── 跨屏拖拽:导航从手机拖到中控屏
├── 多屏联动:中控屏选音乐,后屏显示歌词
├── 屏间切换:导航信息自动显示到仪表盘
└── 内容迁移:应用窗口在屏间迁移4. 车载开发工具
4.1 DevEco Studio 车载开发支持
DevEco Studio 车载开发工具:
├── 车载模拟器:模拟不同车机屏幕
├── 车载 HMI 预览:多屏同时预览
├── 车载 API 检查:车辆 API 兼容性检查
├── 传感器模拟:模拟车速/电量/温度等
├── 性能分析:车载应用性能监控
└── OTA 调试:OTA 升级调试5. 🎯 面试高频考点
Q1: 车载鸿蒙与 Android Auto/CarPlay 的区别?
答要点:
- 架构:车载鸿蒙是原生车载系统,Android Auto/CarPlay 是手机投屏
- 深度集成:车载鸿蒙直接集成车辆 API,第三方仅能访问有限 API
- 自定义:车载鸿蒙 OEM 高度自定义 HMI,Android Auto/CarPlay 固定模板
- 性能:车载鸿蒙原生应用高性能,投屏方案受限于手机性能
- 离线:车载鸿蒙完全离线可用,投屏方案依赖手机网络
- 生态:鸿蒙生态(元服务/分布式) vs Google/Apple 生态
Q2: 车载 HMI 设计原则是什么?
答要点:
- 安全优先:驾驶时减少分心
- 简洁布局:避免信息过载
- 大图标/大字体:远距离可识别
- 语音优先:关键操作通过语音
- 暗色主题:减少眩光
- 多屏协同:仪表盘/中控/后屏/HUD 协同
- 断网可用:离线核心功能可用
Q3: 车机与手机如何协同?
答要点:
- 分布式软总线:设备发现 + 连接
- 跨设备应用迁移:导航/音乐无缝切换
- 多屏协同:内容在屏间迁移/联动
- 共享能力:手机摄像头/麦克风共享给车机
- 同步数据:日历/联系人/媒体库同步
- 统一体验:跨设备一致的操作体验
💡 面试提示:车载鸿蒙是鸿蒙最重要的增长方向之一。重点掌握 原生架构优势、车载 HMI 设计原则、车机-手机协同、多屏协同。对比 Android Auto/CarPlay 时强调深度集成和原生性能。