🔧 核心设计原则(HUIG 4.3 必须遵守!)
| 原则 | 为什么重要? | 我们的实现方式 |
|---|
| 安全第一 | HUIG 4.3 明确要求所有通信必须SSL/TLS(否则车机直接“罢工”) | 所有Socket通信强制用SSLSocket |
| USB优先,WIFI备用 | HUIG 4.3 规定USB是主通道,WIFI仅用于断开重连(避免驾驶时信号飘忽) | 用UsbManager监听USB,WIFI做热备 |
| AOSP原生集成 | 不能魔改Android核心!必须用android.car API(否则车机认证通不过) | 基于AOSP 14+,不碰系统框架 |
| 最小化手机负担 | 车机不能当“手机分身”,所有解码/渲染在车机端完成(HUIG 4.3 7.2节) | MediaCodec在车机解码,手机只传数据 |
🌐 系统架构图(分层设计,一图胜千言!)
┌─────────────────────────────────────────────────────────────────────────────┐
│ APPLICATION LAYER (车机UI层) │
├───────────────────┬───────────────────┬───────────────────────────────────────┤
│ 1. Media Player │ 2. Navigation │ 3. Phone Manager (电话/短信) │
│ - 音频渲染 │ - 地图/路线 │ - 通过`CallScreen` API集成 │
│ - 用AudioTrack │ - 用Google Maps │ - 用`TelecomManager`处理通话 │
│ - 支持多流切换 │ - 仅显示UI │ - 无权限,只透传数据 │
└───────────────────┴───────────────────┴───────────────────────────────────────┘
▲
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ SERVICE LAYER (业务逻辑层) │
├───────────────────┬───────────────────┬───────────────────────────────────────┤
│ 1. Media Service │ 2. Session Manager│ 3. Security Manager (SSL认证) │
│ - 管理MediaPlayer│ - HUIG 4.3 5.1 │ - 用`KeyStore`预置CA证书 │
│ - 解码音频流 │ - 处理连接状态 │ - 每次握手验证手机身份 │
└───────────────────┴───────────────────┴───────────────────────────────────────┘
▲
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ COMMUNICATION LAYER (通信层) │
├───────────────────┬───────────────────┬───────────────────────────────────────┤
│ 1. USB Handler │ 2. WiFi Handler │ 3. Protocol Adapter (HUIG协议转换) │
│ - `UsbManager` │ - `WifiP2p` │ - 用Protobuf转HUIG 4.3协议 │
│ - 优先USB │ - 仅用于重连 │ - 消息: `MediaControlRequest` │
│ - 50ms心跳检测 │ - 10s超时断开 │ - 字段: `track_id`, `volume`, `type`│
└───────────────────┴───────────────────┴───────────────────────────────────────┘
▲
│
┌─────────────────────────────────────────────────────────────────────────────┐
│ AOSP INTEGRATION LAYER (底层支持) │
├───────────────────┬───────────────────┬───────────────────────────────────────┤
│ 1. MediaCodec │ 2. Audio Framework│ 3. Network Stack (SSL) │
│ - 车机端解码 │ - 用AudioFlinger│ - `SSLSocketFactory` + `TrustManager`│
│ - 支持AAC/MP3 │ - 音量分层控制 │ - 防MITM攻击(HUIG 4.3 6.3节) │
└───────────────────┴───────────────────┴───────────────────────────────────────┘
💡 关键模块详解(按HUIG 4.3 重点章节展开)
1️⃣ 连接管理:USB vs WIFI(HUIG 4.3 §5.1)
- USB主通道(必须!):
- 用
UsbManager监听ACTION_USB_DEVICE_ATTACHED,建立UsbDeviceConnection。
- 协议:
ADB over USB + Android Auto Protocol(非自定义,否则车机认证失败!)。
- 心跳:每50ms发
KEEP_ALIVE包(HUIG 4.3 §5.3),断连超过200ms才切WIFI。
- WIFI备用(仅限重连):
- 用
WifiP2pManager建立临时热点(不能用常规WIFI,避免干扰车载网络)。
- 安全:WIFI通信强制用
TLS 1.3(HUIG 4.3 §6.4),证书预埋在车机/system/etc/security/cacerts。
- 坑提醒:别让WIFI当主通道!驾驶中信号波动大,Google会直接拒收你的车机认证。
2️⃣ 媒体解码:MediaCodec + Audio(HUIG 4.3 §7.2)
- 为什么在车机端解码?
HUIG 4.3 明确要求:手机只传原始数据(如AAC流),车机用MediaCodec解码(省手机电量+防延迟)。
- 实现流程:
MediaCodec codec = MediaCodec.createDecoderByType("audio/mp4a-latm");
codec.configure(audioFormat, null, null, 0);
codec.start();
while (dataAvailable) {
ByteBuffer inputBuffer = codec.getInputBuffer(0);
inputBuffer.put(receivedAudioData);
codec.queueInputBuffer(0, 0, dataLength, 0, 0);
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = codec.dequeueOutputBuffer(bufferInfo, 0);
if (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferIndex);
audioTrack.write(outputBuffer, bufferInfo.size, AudioTrack.WRITE_NON_BLOCKING);
codec.releaseOutputBuffer(outputBufferIndex, false);
}
}
- 音频控制:
用AudioManager设置STREAM_MUSIC,通过AudioFocus管理来电优先级(HUIG 4.3 §7.4)。
3️⃣ 安全通信:SSL + 认证(HUIG 4.3 §6.0)
- 认证流程(必须!):
- 车机启动时生成RSA密钥对(存于
KeyStore)。
- 手机连接时,车机发
CERTIFICATE_REQUEST。
- 手机用Google Play服务签名验证(不能自签证书! HUIG 4.3 §6.2)。
- 通过后,建立
SSLSocket(代码示例):
SSLContext sslContext = SSLContext.getInstance("TLSv1.3");
sslContext.init(null, new TrustManager[]{new HUIGTrustManager()}, null);
SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket();
socket.connect(new InetSocketAddress("phone_ip", 5555));
- 防攻击:
所有消息用Protobuf序列化(HUIG 4.3 §5.5),字段校验(如volume必须0-100)。
4️⃣ 导航/电话:仅透传,不处理(HUIG 4.3 §8.0)
- 导航:
手机发NavigationEvent(含latitude/longitude),车机UI只显示地图(不处理路径计算!)。
- 电话:
用PhoneAccount API透传Call对象(如CallScreen),车机只显示来电界面,不处理拨号(避免车机权限滥用)。
⚠️ 必须避开的坑(基于我踩过的雷!)
| 坑点 | 后果 | 解决方案 |
|---|
| 自定义协议(非HUIG) | 车机认证失败,Google拒收 | 严格用android.car API + HUIG 4.3 |
| 手机端解码音频 | 延迟高,驾驶时卡顿 | 车机端用MediaCodec解码 |
| WIFI当主通道 | 信号飘忽,导致断连 | USB优先,WIFI仅重连 |
| 未预埋CA证书 | SSL握手失败,连接超时 | 车机/system/etc/security/cacerts放Google CA |
| 电话权限滥用 | 车机被Google下架 | 仅透传,不处理拨号 |
📌 为什么这个架构能过HUIG认证?
- 完全遵循规范:
HUIG 4.3 §5.1(连接)、§7.2(媒体)、§6.4(安全)全部覆盖。
- AOSP友好:
不改系统框架,只用android.car SDK(车机厂商能直接集成)。
- 安全合规:
SSL/TLS 1.3 + Google签名认证,不是“自己搞个加密”。
- 用户体验:
50ms心跳防断连,USB优先,开车时音乐/导航丝滑不卡顿。