Open Headunit 安卓车机 Native 模式协商双雄:NativeHandoffPolicy 与 NativeCredentialsPolicy 完全指南

发布时间:2026/9/18 11:36:26
Open Headunit 安卓车机 Native 模式协商双雄:NativeHandoffPolicy 与 NativeCredentialsPolicy 完全指南 Open Headunit 安卓车机 Native 模式协商双雄NativeHandoffPolicy 与 NativeCredentialsPolicy 完全指南【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunitOpen HeadunitHeadunit Revived是一款把 Android 平板或手机变成 Android Auto 车机的开源应用。在它的 Native 模式下车机端直接和手机的 Android Auto 原生无线协议握手无需辅助 App。而真正让这套协商稳定落地的是NativeHandoffPolicy和NativeCredentialsPolicy这两个策略对象——一个管时机一个管凭证质量。本文用通俗的方式讲清它们各自解决什么问题、为什么这么设计。一、先搞懂背景Native 模式怎么连在 Native 模式下Open Headunit 有两种传输方式见 NativeStrategy.ktWiFi DirectP2P车机当群组主机默认方式热点Hotspot车机开自己的 WPA2 热点和 OEM ZLink 应用同路连接流程大致是车机把 Wi-Fi 凭证SSID/密码/BSSID通过蓝牙发给手机 → 手机连入 Wi-Fi 网络并跑完 DHCP → 手机建 TCP 会话 → 投屏开始。问题恰恰出在中间那段手机还在路上的时间窗口里——这也是下面两个策略登场的地方。二、NativeHandoffPolicy给交接期上保险的计时管家 源码NativeHandoffPolicy.ktHandoff交接指的是车机已经发出凭证Type 3 消息之后、手机的 TCP 会话真正建立之前的窗口期。实测在慢速硬件上手机要完成关联、WPS、DHCP最长可达21 秒。这期间如果乱动比如碰蓝牙电台、把 P2P 主机切信道手机会直接放弃入网界面卡在获取 IP 地址…。这个对象用几个清晰的时间规则把窗口期管住规则数值作用SETTLE_TIMEOUT_MS45 秒基础稳定期宁等慢一次不冒断连风险MAX_SETTLE_MS90 秒手机反复报还在连时的硬上限防止无限占线HANDSHAKE_TIMEOUT_MS90 秒一次完整凭证交换的最长合理时间更妙的是它给出的三种行动指令loopStepPOKE戳一下条件允许就主动开一条蓝牙 HFP 连接把手机叫醒DEFER等一下用户正在配置界面时先别戳——成功的戳会直接把投屏弹到用户脸上打断操作STOP停会话已建立或正在握手/稳定期此时戳人只会添乱此外还有两条自保规则都是实测踩坑后的产物连续失败熔断等待手机 Type 2 消息连续超时 5 次就停止接待新握手。因为在部分车机上关蓝牙 socket 无法打断阻塞的readFully()协程线程会永久卡死——线程回收不了只能不再生成新的。永不重启发现Native 路径上手机是靠蓝牙发来的凭证按 SSID 找上门的discoverPeers()每 10 秒把主机拉离信道恰恰是手机永远完不成 DHCP 的元凶见 WifiDirectManager.kt 中的调用。它还内置了一个手机有回音却从不建连的诊断告警连续 3 次戳醒都成功、但 Android Auto 通道始终没开通常是手机的 Android Auto 绑定了另一块也广播 Android Auto 服务的蓝牙芯片常见于车机自带的 OEM 模块这条提示能帮你快速定位。三、NativeCredentialsPolicy发出去之前先验货的凭证守门员 源码NativeCredentialsPolicy.kt握手前先问三个问题BSSID 可用吗热点真的开着吗该不该把凭证发出去3.1 BSSID 缺失时的分路策略BSSIDWi-Fi 网卡 MAC是手机连接的关键字段。现代手机如 Gearhead用WifiNetworkSpecifier按SSID BSSID 双重匹配BSSID 缺失会得到WIFI_INVALID_BSSID拒绝——项目方在 2026-08-05 做了手机对手机实测确认。但缺 BSSID 怎么办因传输方式而异WiFi Direct 路径 → 直接中止ABORT实测 BSSID 被掩码时手机照样拒绝发出去只是制造看起来健康的假握手热点路径 → 照样发但留空字段SEND_WITH_EMPTY_BSSID虽然空 BSSID 大概率连不上但手机的明确拒绝是一条可以解释的线索而中止只留下一片空白3.2 热点没开时绝不广播shouldPublishCredentials防止一类隐蔽事故某联发科平台上真正的热点已停但蜂窝网桥seth_lte0还带着私网地址活着应用就把正确的网络名配了个手机根本到不了的地址还记了条 SUCCESS。因此只要框架明确说热点没开就不广播。只有两条豁免状态读取失败UNKNOWN不拒绝——getWifiApState()不是公开 API有些设备直接拦截问不出口的问题不能算问到了且是否用户手动指定了网卡名不拒绝——这是厂商在框架外自启 hostapd 时的逃生通道值得注意的是手填 SSID故意不算豁免它只是给网络起了个名字却会在最需要这道检查的设备上把检查关掉。四、双雄如何协作一次完整的握手旅程手机开机/重连 │ ▼ 车机检查凭证 ──(BSSID 不可用?)──▶ NativeCredentialsPolicy 决定中止或照发 │ ▼ 经蓝牙发出凭证 (Type 3) │ ▼ 进入稳定期 ── NativeHandoffPolicy 接管 ──▶ 冻结蓝牙动作/禁止发现扫描 │ (45 秒可延至 90 秒) ▼ 手机 TCP 会话建立 ──▶ 窗口关闭正常投屏 │ └─(超时?)──▶ 触发唤醒戳重试连续 5 次握手失败则熔断停止接待调用方主要有 NativeAaHandshakeManager.kt握手主流程和 SoftApCredentialsProvider.kt热点凭证发布。配套的预检工具 NativeCredentialsPreflight.kt 则让用户在设置页里就能提前探明这台车机到底能不能给出完整凭证不必等握手时才翻车。两者都被刻意写成纯 Kotlin 对象不依赖 Android 运行时所以能在无设备环境下单元测试——规则逻辑可独立验证这也是这个项目大量策略文件Policy的统一设计风格。五、想深入从这里读起想了解的入口文件稳定期/熔断规则实现NativeHandoffPolicy.kt凭证验货与分路NativeCredentialsPolicy.kt设置页预检探针NativeCredentialsPreflight.kt握手状态机NativeAaHandshakeManager.kt单元测试NativeHandoffPolicyTest.kt、NativeCredentialsPolicyTest.kt六、常见问题速答Q为什么手机卡在获取 IP 地址不动多半是稳定期内有动作惊扰了入网流程。NativeHandoffPolicy 的 45 秒窗口就是为此设计的——等它超时后会自动重试。Q提示需要手动填写 BSSID是什么情况说明系统无法自动读出热点/P2P 网卡的 MAC。此时在设置中填入静态 BSSID 即可这正是代码注释里强调的修复手段而非权宜之计。QNative 模式适合谁Android Auto 17.4 上第三方无线触发大多失效Native 模式Wi-Fi Direct 或车机热点是官方文档推荐的纯软件方案适合不想加 USB 无线 Dongle 的用户。一句话总结NativeCredentialsPolicy 管发出去的东西质量合格NativeHandoffPolicy 管发出后到接通前的每一秒不乱动——一前一后共同把一次脆弱的跨设备握手变成了普通用户只需点一次就能完成的体验。【免费下载链接】open-headunitHeadunit App for displaying Android Auto项目地址: https://gitcode.com/GitHub_Trending/he/open-headunit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考