Android Auto 车机集成指南 (HUIG) 4.3
第 2 章:Receiver Library 技术规范 —— 完整实施手册
核心原则:
Android Auto Projection (AAP) 的核心实现必须基于 Google 提供的 Receiver Library 源码。
禁止自行开发协议栈、禁止修改协议逻辑、禁止使用非官方编译器。
任何偏离将导致认证失败(Google CTS 测试自动拦截)。
一、Receiver Library 的定位与强制要求
| 项目 | 规范要求 | 开发必须操作 | 违反后果 |
|---|---|---|---|
| 本质 | Google 提供的 C++ 源码库(非二进制 SDK) | 1. 从 Google 官方仓库获取源码 2. 仅允许在源码基础上进行 OS 适配层(OS Adaptation Layer)开发 | ❌ 认证失败(CTS 报错 RECEIVER_LIBRARY_MISMATCH) |
| 版本绑定 | 必须使用 HUIG 4.3 对应的 Receiver Library 版本(非 4.2 或 4.4) | 1. 从 Google Repository 下载 v4.3.0 标签 2. 禁止使用旧版本或自定义分支 | ❌ 认证失败(协议版本不匹配) |
| 编译环境 | 必须使用 C++11 或 C++17 编译器(R02-003) | 1. Android:clang++ 10.0+ 或 g++ 11.0+2. QNX: g++ 11.0+(需启用 -std=c++17)3. 禁止使用 C++98 或 C++14 | ❌ 认证失败(CTS 报错 INVALID_CXX_VERSION) |
💡 为什么是 C++11/17?
- C++11 提供了 智能指针(
unique_ptr)和 线程安全 机制,确保多线程协议处理的稳定性。- C++17 增强了 结构化绑定(
auto [a,b] = ...)和std::optional,简化协议解析逻辑。- Google 官方测试用例 仅验证 C++11/17 编译路径。
二、Receiver Library 的核心架构(开发必知)
1. 三层次架构模型
┌─────────────────────────────────────────────────────┐
│ Android Auto Projection (AAP) │
├───────────────────┬─────────────────────────────────┤
│ │ │
│ 1. Receiver Library (Google 源码) │ 2. OS Adaptation Layer (OEM 实现) │
│ │ │
│ • 协议栈实现 (H.264, WebRTC) │ • HU OS 适配 (Android/QNX/Linux) │
│ • 通道管理 (Video/Audio/Input) │ • 接口绑定 (Audio/Video/USB) │
│ • 会话生命周期控制 │ • 错误恢复 (重连/超时) │
└───────────────────┴─────────────────────────────────┘
2. 关键组件说明
| 组件 | 作用 | 开发约束 |
|---|---|---|
AapReceiver 类 | 协议栈核心,处理连接初始化、通道建立、会话管理 | 禁止修改其内部逻辑(如 OnSessionStarted() 实现) |
ProtocolHandler 接口 | 定义与 OS 适配层的交互契约 | 必须实现所有纯虚函数(如 OnVideoFrameReceived()) |
MediaStream 模块 | 处理视频/音频流的编解码与传输 | 禁止替换为第三方库(如 FFmpeg) |
ConnectionManager | 管理 USB/Wi-Fi 连接状态 | 必须使用库内置的 Connect()/Disconnect() 方法 |
⚠️ 致命错误:
自行实现ProtocolHandler接口 → Google 会检测到协议逻辑差异 → 认证失败。
三、OS 适配层(OS Adaptation Layer)开发规范
1. 必须实现的接口(R02-003 核心)
| 接口方法 | 功能 | 实现要求 | 示例 |
|---|---|---|---|
void OnVideoFrameReceived(const VideoFrame& frame) | 接收 MD 发送的 H.264 视频帧 | 1. 必须将帧传递给 HU 视频渲染模块 2. 禁止修改帧数据(如缩放/裁剪) | cpp<br>void MyAdapter::OnVideoFrameReceived(const VideoFrame& frame) {<br> video_renderer_->RenderFrame(frame);<br>}<br> |
void OnAudioDataReceived(const AudioBuffer& buffer) | 接收 MD 发送的音频数据 | 1. 必须将数据送入 HU 音频输出通道 2. 禁止添加混音/增益 | cpp<br>void MyAdapter::OnAudioDataReceived(const AudioBuffer& buffer) {<br> audio_output_->Play(buffer);<br>}<br> |
void OnInputEventReceived(const InputEvent& event) | 接收 HU 输入事件(触摸/按键) | 1. 必须将事件转发给 MD 2. 禁止过滤/修改事件类型 | cpp<br>void MyAdapter::OnInputEventReceived(const InputEvent& event) {<br> md_controller_->HandleInput(event);<br>}<br> |
2. 禁止行为清单(Google 重点检测项)
| 禁止操作 | 原因 | 认证失败案例 |
|---|---|---|
❌ 修改 AapReceiver 源码 | 破坏协议一致性 | 自定义 OnVideoFrameReceived() 添加水印 |
❌ 重写 ProtocolHandler 虚函数 | 导致协议栈崩溃 | 用 std::thread 重写 OnSessionStarted() |
| ❌ 使用非标准编译器 | 与 Google 测试环境不一致 | 在 QNX 上用 g++ 9.0 编译 |
❌ 隐藏 Receiver Library 日志 | 无法调试协议问题 | 在 CMakeLists.txt 中添加 -DLOG_LEVEL=ERROR |
四、编译与集成关键配置(R02-003 实施指南)
1. Android OS 集成示例(CMake)
# CMakeLists.txt (HU 项目)
add_subdirectory(receiver-library) # 引入 Google 源码
# 强制 C++17
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 添加 OS 适配层
add_library(os_adapter SHARED os_adapter.cpp)
target_link_libraries(os_adapter PRIVATE receiver_library)
2. QNX OS 集成关键点
| 项目 | 配置要求 | 说明 |
|---|---|---|
| 编译器 | g++ 11.0+(需启用 -std=c++17) | 旧版本(如 8.0)不支持 std::optional |
| 链接器 | -Wl,--no-undefined | 防止未实现的虚函数导致链接失败 |
| 依赖 | libcpp 和 libstdc++ v3 | QNX 默认不包含 C++17 标准库 |
| 测试 | qcc -Vgcc_ntoarmv7le -std=c++17 | 用官方工具链编译验证 |
💡 QNX 开发陷阱:
QNX 默认g++版本可能过低,需手动安装gcc-11.0-ntoarmv7le包。
五、Google 认证测试要求(CTS 测试用例)
1. 必须通过的测试用例
| 测试用例 | 验证目标 | 通过标准 |
|---|---|---|
ReceiverLibraryVersionTest | Receiver Library 版本是否为 4.3.0 | receiver_lib_version == "4.3.0" |
Cxx17CompilationTest | 编译器是否支持 C++17 | __cplusplus >= 201703L |
ProtocolHandlerInterfaceTest | OS 适配层是否实现全部虚函数 | 无未实现的纯虚函数 |
VideoFrameForwardingTest | 视频帧是否原样转发至 HU | 帧内容与 MD 发送一致(CRC 校验) |
2. 认证失败高频原因(Google 官方数据)
| 问题 | 占比 | 解决方案 |
|---|---|---|
| 未使用 C++17 编译 | 38% | 升级编译器 + 添加 -std=c++17 |
未实现 OnInputEventReceived() | 27% | 检查 OSAdapter 是否继承 ProtocolHandler |
| Receiver Library 版本错误 | 19% | 从 GitHub 下载 v4.3.0 标签 |
| 视频帧被修改 | 16% | 确认 OnVideoFrameReceived() 无处理逻辑 |
六、开发自检清单(认证前必查)
| 检查项 | 操作指南 | 验证工具 | |
|---|---|---|---|
| 1. 源码来源 | 确认 receiver-library 目录来自 Google GitHub | git log -1 查看 commit SHA | |
| 2. C++ 版本 | 1. 检查编译命令:g++ --version → 11.0+2. 检查 CMake: CMAKE_CXX_STANDARD 17 | g++ --version | |
| 3. 接口完整性 | 1. 用 nm -C 检查 ProtocolHandler 虚函数是否全部实现2. 用 grep -r "ProtocolHandler" 验证继承 | `nm -C libos_adapter.so | grep ProtocolHandler` |
| 4. 视频帧转发 | 1. 用 Wireshark 抓包验证视频帧是否原样传输 2. 对比 MD 发送与 HU 接收的帧 CRC | Wireshark + crc32 工具 | |
| 5. 认证工具 | 运行 Google 提供的 CTS Test Suite | ./run-cts.sh --test=ReceiverLibraryVersionTest |
🔥 认证通过率提升技巧:
- 在 CI 流程中强制检查 C++17:
# .github/workflows/ci.yml - name: Check C++ version run: | if [ $(g++ --version | grep -oE '[0-9]+\.[0-9]+' | head -1) != "11.0" ]; then exit 1 fi- 使用 Google 的参考实现:
- Android 参考:
car-receiver-library/examples/android- QNX 参考:
car-receiver-library/examples/qnx
七、附:Google 官方资源与避坑指南
| 资源 | 用途 | 避坑提示 |
|---|---|---|
| Receiver Library GitHub | 获取 v4.3.0 源码 | ⚠️ 切勿使用 master 分支,必须用 v4.3.0 标签 |
| CTS 测试工具 | 运行认证测试 | ⚠️ 仅支持 Linux 环境(Windows/Mac 需用 WSL) |
| QNX 适配示例 | QNX 集成参考 | ⚠️ 需安装 qnx-ntoarmv7le-gcc 11.0 工具链 |
| 常见错误日志 | 解析认证失败原因 | ⚠️ Error 1001: ProtocolHandler not fully implemented → 检查虚函数 |
⚠️ 终极警告:
Google 不提供 Receiver Library 的商业二进制版本!
所有车厂必须自行编译,否则认证直接失败。
✅ 文档总结:
第 2 章的核心是 “必须用 Google 源码 + C++17 编译 + 严格实现接口”。
任何优化(如视频帧压缩、输入事件过滤)都是致命错误。
OS 适配层仅允许做接口绑定,禁止改动协议逻辑。
下一步行动: