
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),仅供参考