Android Auto开发(2)-Receiver Library

7 阅读6分钟

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-0031. 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防止未实现的虚函数导致链接失败
依赖libcpplibstdc++ v3QNX 默认不包含 C++17 标准库
测试qcc -Vgcc_ntoarmv7le -std=c++17用官方工具链编译验证

💡 QNX 开发陷阱
QNX 默认 g++ 版本可能过低,需手动安装 gcc-11.0-ntoarmv7le 包。


五、Google 认证测试要求(CTS 测试用例)

1. 必须通过的测试用例

测试用例验证目标通过标准
ReceiverLibraryVersionTestReceiver Library 版本是否为 4.3.0receiver_lib_version == "4.3.0"
Cxx17CompilationTest编译器是否支持 C++17__cplusplus >= 201703L
ProtocolHandlerInterfaceTestOS 适配层是否实现全部虚函数无未实现的纯虚函数
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 GitHubgit log -1 查看 commit SHA
2. C++ 版本1. 检查编译命令:
g++ --version11.0+
2. 检查 CMake:CMAKE_CXX_STANDARD 17
g++ --version
3. 接口完整性1. 用 nm -C 检查 ProtocolHandler 虚函数是否全部实现
2. 用 grep -r "ProtocolHandler" 验证继承
`nm -C libos_adapter.sogrep ProtocolHandler`
4. 视频帧转发1. 用 Wireshark 抓包验证视频帧是否原样传输
2. 对比 MD 发送与 HU 接收的帧 CRC
Wireshark + crc32 工具
5. 认证工具运行 Google 提供的 CTS Test Suite./run-cts.sh --test=ReceiverLibraryVersionTest

🔥 认证通过率提升技巧

  1. 在 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
    
  2. 使用 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 适配层仅允许做接口绑定,禁止改动协议逻辑

下一步行动

  1. 立即从 GitHub 下载 v4.3.0
  2. 按照 QNX 示例 搭建开发环境
  3. CTS 测试工具 运行 Cxx17CompilationTest 验证编译环境