Android Auto开发

87 阅读4分钟

🔧 核心设计原则(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); // 从USB/WIFI接收
        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)

  • 认证流程(必须!):
    1. 车机启动时生成RSA密钥对(存于KeyStore)。
    2. 手机连接时,车机发CERTIFICATE_REQUEST
    3. 手机用Google Play服务签名验证(不能自签证书! HUIG 4.3 §6.2)。
    4. 通过后,建立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优先,开车时音乐/导航丝滑不卡顿。