Open Headunit项目架构总览:从USB接入到Android Auto投屏的完整数据链路
Open Headunit项目架构总览从USB接入到Android Auto投屏的完整数据链路【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen Headunit 是一款开源的 Android Auto 投屏接收器应用它能把安卓平板或手机变成一台Android Auto 车机Headunit接收手机端的 Android Auto 画面与音频并全屏呈现。本文带你从源码角度梳理它的整体架构看懂从 USB 接入、SSL 握手、AAP 协议解析到音视频解码投屏的完整数据链路。 Open Headunit 能做什么简单来说它的角色相当于车机里的Android Auto 接收端USB 有线接入手机通过 USB 线连接平板模拟 Android Auto 主机协议通信无线接入支持 Wi-Fi DirectP2P、车机热点、Headunit Server 等多种连接策略Self-Mode 模式同一台设备上既当手机又当车机用于开发调试完整投屏解码手机端推送的视频流并全屏渲染同时输出音频、回传触控与按键事件项目根目录的 README.md 有详细的使用说明与已知问题清单。 四层架构UI、连接、协议、解码Open Headunit 的源码位于app/src/main/java/com/andrerinas/openheadunit/按职责可以划分为四层层级核心目录职责UI 层main/主页、设置、网络列表、自动连接等界面连接层connection/USB / Wi-Fi / Self-Mode 三种接入方式的物理链路管理协议层aap/Android Auto ProtocolAAP消息收发、SSL 握手解码层decoder/音频解码AAC、视频解码H.264 / HEVC连接层内部又按接入方式分目录组织USB 相关connection/usb/含设备识别、权限申请、端点选择等策略Wi-Fi 相关connection/wifi/又细分为direct/Wi-Fi Direct、modes/nativeaa/原生无线协议握手、modes/helper/配合 Wireless Helper 应用Self-Mode 启动器connection/self/launchers/投屏连接抽象connection/projection/定义统一的 ProjectionConnection.kt 接口 完整数据链路从 USB 接入到投屏的 5 步整个连接生命周期由核心类 CommManager.kt 统一管理。它在类注释中直接给出了状态机图CommManager.kt#L40-L67Disconnected → Connecting → Connected → StartingTransport → HandshakeComplete → TransportStarted → Disconnected这正好对应下面 5 个阶段ConnectionState状态定义见 CommManager.kt#L91-L122。步骤 1物理连接建立Connecting → ConnectedUSB 场景UsbReceiver.kt 监听 USB 设备插入广播UsbDeviceIdentityPolicy.kt 判断设备是否是 Android 手机随后申请设备权限并打开 USB 接口。无线场景Wi-Fi Direct 由 WifiDirectManager.kt 负责组建 P2P 群组原生无线模式则由 NativeAaHandshakeManager.kt 完成与 Android Auto 的握手最终建立 TCP 连接。无论哪种方式最终都封装为ProjectionConnectionUSB 直连、libusb 或 Socket 三种实现物理链路就绪后状态推进到Connected。步骤 2SSL/TLS 握手StartingTransport → HandshakeCompleteAAP 协议全程运行在加密通道上。CommManager持有全局唯一的AapSslContext基于 SslContextFactory.kt 构建支持 TLS 会话恢复让断线重连时的握手更快。SSL 完成后状态进入HandshakeComplete并触发投屏界面启动。步骤 3AAP 协议层收发消息TransportStarted传输层由 AapTransport.kt 实现生命周期为startHandshake → startReading → 消息循环。消息采用通道 类型的二进制帧格式具体帧拆分逻辑在 AapMessageFraming.kt。协议消息体由 Protobuf 定义源码在 app/src/main/proto/ 目录common.proto通用消息Hello、ByeBye 等media.proto / playback.proto媒体元数据与播放状态input.proto触控事件与按键事件wireless.proto无线握手相关解密后的每条消息会分发到 AapMessageHandler.kt 处理视频帧、音频帧、媒体信息、触控事件各走各的通道。步骤 4音视频解码音频AudioDecoder.kt 将手机端推来的 AAC 音频流解码后写入 AudioTrackMicRecorder.kt 负责反向采集麦克风上行视频VideoDecoder.kt 处理 H.264 解码HEVC 则走 C 层的 FFmpeg 原生解码器 ffmpeg_hevc_decoder.cpp预编译库在app/src/main/jniLibs/。解码层还配有大量策略类如丢帧恢复、码流背压、关键帧修复保证投屏流畅步骤 5投屏渲染与状态广播AapProjectionActivity.kt 是全屏投屏 Activity解码出的画面渲染在 TextureProjectionView.kt 等视图上触控坐标经 TouchCoordinateMapper.kt 换算后回传给手机。服务层 AapService.kt 是整条链路的总调度它在 AapService.kt#L1037-L1091 的observeConnectionState()中统一观察连接状态流HandshakeComplete时启动投屏界面TransportStarted时开始正式投屏并向自动化工具Tasker 等广播会话状态。 快速上手与源码导航想动手体验的话可以先看 README.md 中的 USB 与无线接入步骤想深入某条链路建议按下面的顺序读源码想看什么从哪里读起连接状态机CommManager.ktUSB 接入全流程connection/usb/Wi-Fi Direct 组网connection/wifi/direct/AAP 消息收发aap/AapTransport.kt视频解码策略decoder/video/投屏界面aap/AapProjectionActivity.kt 小结Open Headunit 的架构非常清晰CommManager 管链路、AapTransport 管协议、Decoder 管解码、ProjectionActivity 管呈现一条USB/Wi-Fi 接入 → SSL 握手 → AAP 消息流 → 音视频解码 → 全屏投屏的单向数据流贯穿始终反向的触控与音频上行则走同样的通道回传。理解了这个数据链路再去阅读各模块源码就会事半功倍。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

如何快速用 Godot 官方示例项目入门游戏开发

如何快速用 Godot 官方示例项目入门游戏开发

如何快速用 Godot 官方示例项目入门游戏开发 【免费下载链接】godot-demo-projects Demonstration and Template Projects 项目地址: https://gitcode.com/GitHub_Trending/go/godot-demo-projects 刚想上手 Godot,却不知道该从哪一行代码开始写?…

2026/9/20 4:32:05 阅读更多 →
Redux 全局状态管理实战指南:核心 API、Redux Toolkit 与项目接入

Redux 全局状态管理实战指南:核心 API、Redux Toolkit 与项目接入

Redux 全局状态管理实战指南:核心 API、Redux Toolkit 与项目接入 【免费下载链接】redux A JS library for predictable global state management 项目地址: https://gitcode.com/gh_mirrors/re/redux Redux 是一个用于"可预测且可维护的全局状态管理&…

2026/9/19 19:46:50 阅读更多 →
VMware共享文件夹三步闭环:Tools驱动+UNC映射+服务验证

VMware共享文件夹三步闭环:Tools驱动+UNC映射+服务验证

简介:本资源是一份面向VMware初学者与虚拟化实践者的实操指南,聚焦解决Windows主机与虚拟机间文件共享这一高频痛点问题。内容以图文结合方式,系统讲解共享文件夹配置全流程:从虚拟机设置中添加主机目录、载入windows.iso安装VMwa…

2026/9/20 2:49:39 阅读更多 →

最新新闻

AI辅助公文写作全指南:从提示词技巧到本地化部署实践

AI辅助公文写作全指南:从提示词技巧到本地化部署实践

写公文这件事,以前是典型的“笔杆子活”,讲究的是逻辑严密、用词准确、格式规范。现在越来越多的伙伴开始尝试用AI写公文,但普遍卡在一个心态上:看着AI几秒钟吐出一大段,心里既兴奋又发虚——这东西到底能不能直接用&a…

2026/9/20 4:32:09 阅读更多 →
LibreChat:开源Agent编排中枢与MCP协议实战指南

LibreChat:开源Agent编排中枢与MCP协议实战指南

1. LibreChat 是什么?一个真正能落地的开源对话平台 LibreChat 不是另一个“玩具级”聊天界面,也不是套着 Web UI 外壳的 API 转发器。它是一个从第一天起就按生产环境标准设计的、可自托管、可深度定制、可与企业级基础设施无缝集成的 开源大模型对话…

2026/9/20 4:32:09 阅读更多 →
PyPTO 掩码操作(Mask Operations)实战指南:create_mask / mask_gen_with_reg_tensor / update_mask 深入解析

PyPTO 掩码操作(Mask Operations)实战指南:create_mask / mask_gen_with_reg_tensor / update_mask 深入解析

人工智能编译器模型编译高性能计算深度学习CANN 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto 点击查看 免费下载 导读 本文围绕 CANN/P…

2026/9/20 4:32:09 阅读更多 →
从开放权重到开放过程:OpenResearch如何开源AI研究?

从开放权重到开放过程:OpenResearch如何开源AI研究?

过去一年多,我几乎每周都会被一个新出现的 AI 项目刷屏,但大多数项目热度撑不过一个月。可“OpenResearch”这个名字,从技术社区、开源圈一路火到我所在的 AI 应用开发群,而且热度是持续上升的。它不是又放出了一个开源模型权重&a…

2026/9/20 4:32:09 阅读更多 →
ONNX 维度标注(Dimension Denotation)机制解析:为张量轴赋予语义的类型检查方案

ONNX 维度标注(Dimension Denotation)机制解析:为张量轴赋予语义的类型检查方案

人工智能深度学习机器学习 【免费下载链接】onnx Open standard for machine learning interoperability 项目地址: https://gitcode.com/gh_mirrors/onn/onnx 点击查看 免费下载 维度标注(Dimension Denotation)是 ONNX 中一套实验性的机制…

2026/9/20 4:32:09 阅读更多 →
AI智能体工作台WorkBuddy:从任务编排到自动化实战

AI智能体工作台WorkBuddy:从任务编排到自动化实战

这两年 AI Agent 工具越来越多了,但我发现多数人还是把 AI 当聊天框用:问一句答一句,用完就关。直到我花了两周时间把 WorkBuddy 塞进真实工作流里,才意识到“对话式 AI”和“工作台型 Agent”的差别有多大。WorkBuddy 不是又一个…

2026/9/20 4:31:09 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →