banner
约 4,200 字
14 分钟

DiPlay 使用指南:让安卓车机自己变成 CarPlay 接收端(分高低版本两条线)

DiPlay 使用指南:让安卓车机自己变成 CarPlay 接收端(分高低版本两条线)

摘要

DiPlay 是装在车机上的开源 CarPlay 接收端,免越狱、免 dongle。本文按车机 Android 版本分两条线:高版本走官方主线 v0.2.18(minSdk 25),Android 4.4~6.0 老车机走 Legacy 分支 v0.2.40(minSdk 19),含 NDP 死锁、签名证书误用等迁移坑与排错表。

原车没有 CarPlay,换车机又太贵——DiPlay 让安卓车机自己变成 CarPlay 接收端:把 iPhone 插上 USB 或连上热点,原车屏幕直接显示 CarPlay 界面,不越狱、不买 dongle、不用 Mac、不需要账号。

本文按车机 Android 版本分两条线讲清楚:高版本走官方主线 v0.2.18,低版本(Android 4.4~6.0)走 Legacy 分支 v0.2.40,两条线的版本号、安装取舍与迁移坑都来自各自的 release tag 与源码。

一、先认清这是个什么项目

DiPlay 是一个独立的 CarPlay 接收端 APK,装在车机上,不是装在 iPhone 上。它自带从 Carlinkit 公开固件里提取的实验性配件身份,所以不需要越狱、不需要 dongle、不需要认证服务器——但这也意味着它不是 Apple 认证产品,这个边界后面单列一节讲。

它的应用包名 com.shihab.diplay,可以和车机原厂的 DiAuto 并存,但同一时间只能跑一个投屏应用。

先说清楚上游的支持口径,免得期望错位:

  • 上游官方明确「这些项目专注于比亚迪汽车。它们可能在其他品牌上运行,但其他品牌不在支持范围内,也没有增加支持或修复其品牌特定兼容性问题的计划」。

  • 全部是 0.x 早期版本,没有 1.0 及以上正式版;v0.2.18 自身也标注为 public preview(预发布)。

  • 不同作者的分支签名证书各不相同,互相不能覆盖安装,这一点是后面所有安装坑的根源。

DiPlay 主界面
DiPlay 主界面

二、按车机版本选分支

这是全文最重要的一张表。分支不同不等于版本新旧——Legacy 的 v0.2.40 数字比主线 v0.2.18 大,但它服务的是更老的车机,两者是并行的两条线,不是前后关系。

车机 Android 版本

该用哪个

当前 tag

装机门槛

Android 7.1 及以上

shihabal3amri/DiPlay(官方主线)

v0.2.18

minSdk 25

Android 7.1 及以上,要中文增强

serein-morii/DiPlay-CN

v0.2.18-cn.3

基于上游 v0.2.18

Android 4.4 ~ 6.0

programmerguohuajing/DiPlay-Legacy-Android

v0.2.40

minSdk 19

零跑 2021–2023 车型

Wh1t3co1azZ/DiPlay-Leapmotor

v0.2.18-Leap

基于上游 v0.2.18

各分支的 minSdk 我都从 tag 对应的 mobile/build.gradle.kts 里读出来核对过,不是抄描述文字:主线 minSdk = 25 / targetSdk = 37 / versionCode = 37,Legacy minSdk = 19 / targetSdk = 37 / versionCode = 60,两者 applicationId 都是 com.shihab.diplay。

老车机有个圈内常见坑:很多后装/改装车机在系统界面显示的「Android 10/11/12」是商家虚标的,实测底层常是 Android 4.4、5.1 或 6.0 魔改。如果你按设置里显示的版本选了主线,装上去「解析程序包出现问题」,先别怀疑包坏了——用配套的车机版本检测工具 493330227-wq/headunit-version-inspector 看真实的 Android 版本与 API Level。

三、高版本线:官方主线 v0.2.18

这条线的分水岭是 v0.2.15

上游的支持范围不是一开始就这么宽的,以 `v0.2.15` 为界:

  • v0.2.14 及更早:release notes 原文写着「Android 9 or newer (API 28+) remains required」——必须 Android 9 以上。

  • v0.2.15 起:原文改成「Android 7.1+ (API 25) is now supported by the app」,靠的是「guarded newer Android APIs and legacy networking/storage paths」,也就是把新 API 包在版本判断里,再补一套旧版网络与存储路径。同时在 v0.2.15 里做的还有首次启动向导自动识别 DiLink 版本、应用内检查更新(校验 SHA-256)、安装权限流同时兼容新旧 Android。

  • 但官方也把话说死了:「This is not a guarantee that every older head unit works.」,并且 Android 7.1–8.1 的实车验证尚未完成。

所以如果你的车机是 Android 9 或 10,主线随便装;如果是 7.1~8.1,属于能装但没实车背书;如果低于 7.1,主线装不上,直接去低版本线。

v0.2.18 这一版改了什么

以下均出自 v0.2.18 的 CHANGELOG 与 release notes:

  • 有线稳定性:修掉「USB 读取恰好完成,而 DiPlay 同时停止等待」导致每隔几分钟掉线的问题;有线 CarPlay 现在能在 Android 7.1 车机上启动,也能在车机 USB 音频驱动占着 iPhone 的情况下启动。

  • 音频:音乐解码器不再等 10 ms 就把声音丢掉,短暂断音减少。

  • 蓝牙:车机安卓蓝牙连不到 iPhone 时,无线 CarPlay 给出明确原因并建议改用 USB,不再盲目重试。

  • 方向盘:在 CarPlay 画面里切上一首/下一首不再依赖方向盘按键服务;吉利/领克 geely_fx11 车机获得方向盘媒体键与 Siri 支持。

  • 设置:设置 → 关于 里可以用手机扫码备份/恢复设置,更新时可改选 MT 管理器等第三方安装器。

签名与覆盖升级

主线的覆盖升级要求包名 + 签名证书一致。官方 release notes 写明沿用了既有签名证书,因此从上一个公开版本覆盖安装可以保留设置与配对记录。但不要靠文件名判断能不能覆盖——跨分支(比如从 Legacy 换到主线、或者从第三方修改版换到官方版)一律先卸载。

四、低版本线:Legacy 分支 v0.2.40

这一分支基于上游 DiPlay 做了深度兼容重构,专门补 Android 4.4 (API 19) 至 Android 6.0 这个区间,以及全志 T3、联发科 MTK、AC8227L、Intel x86 等 32 位老芯片与定制 ROM。

它为了能在老系统上跑,动了哪些地方

这些都是 README 里逐条列出的,且都能在源码里对上:

  • 系统 API 兼容:修掉 Android 7.0 以下因 Configuration.locales 触发的 NoSuchFieldError 启动闪退;修掉 Android 6.0 以下调用 Context.getSystemService(Class) 引发的 NoSuchMethodError;Android 5.0 以下 Theme.Material 主题缺失会回退到 Holo。

  • 安装与解析包失败:上游通常只打 v2 签名,而 Android 4.4/6.0 的老车机装 v2-only 包会直接报「无法解析安装包」。Legacy 采用 v1 (JAR) + v2 (APK) 双重签名,覆盖 Android 4.4 ~ 14+。

  • 全架构:原生编译 armeabi-v7a / x86 / arm64-v8a / x86_64 四种;32 位老车机可以用体积精简 60% 以上的 ARMv7 专版,降低 4.4 系统 Dalvik 内存开销。

  • 蓝牙:老系统没有 BluetoothLeScanner,支持在设置里手动输入车机蓝牙 MAC 地址完成握手。

  • 音频通道:非比亚迪 AOSP 老车机的默认 stream 14 异常,自适应降级为标准 STREAM_MUSIC。

三个值得知道的技术修复

① NDP 邻居发现死锁(v0.2.38)——车机端建立的是三层虚拟 TUN 网卡(Point-to-Point / NOARP)。iPhone 发 CarPlayStartSession 前必须先解析车机链路地址 fe80::2 的 MAC,于是广播 ICMPv6 Neighbor Solicitation(Type 135)。而 TUN 是纯三层设备,Linux 内核收到 NS 直接丢弃、绝不应答 NA,iPhone 永远解析不到车机 MAC,双方就卡在「CarPlay控制通道运行中」。修复方式是在 NCM 层实现 NDP 代理:应用层拦截发往车机链路本地地址的 NS,直接构造并回传 Solicited NA(S=1, O=1,带车机 MAC),并在首次拿到 iPhone MAC 时主动单播 NA 通知。

② USB 配置误报 EBUSY(16)(v0.2.38)——iPhone 插入时可能已被上一次连接或系统 usbfs 置于 Configuration 6,此时再执行 ioctl(fd, USBDEVFS_SETCONFIGURATION, 6),内核返回 EBUSY (errno=16),旧逻辑当成硬错误抛 DeviceUnavailable 中断建联。修复后:返回 EBUSY 且当前激活配置已是目标配置 6 时,安全判定为复用成功。

③ 无线有声但声音从手机出来(v0.2.38)——AirPlay 的 Info.plist 中 type 100 default 的 input 未声明 Opus(0x70000000),iPhone 据此判定车机不支持无线音频,把声音路由回了手机。修复:补上 pcmMono or 0x70000000。

签名踩坑与迁移(v0.2.32)

这是低版本线上最需要注意的一次破坏性变更:

  • v0.2.24 ~ v0.2.31 这几个版本误用了 Android Debug 证书,导致已经装了 v0.2.21 正式版的用户覆盖安装时报 INSTALL_FAILED_UPDATE_INCOMPATIBLE。

  • v0.2.32 找回原始 keystore,并加了 verifyReleaseSigningIdentity 强制白名单校验,构建时把证书 SHA-256 与基准证书比对,不匹配就中止。

  • 基准证书(v0.2.21 公开包)指纹:bca015c0cb43469fee55539b4054ff862671e7b41e6612eee0cb8566d327b7ae。

现在怎么安全升级:确认你装的是 v0.2.32 及以后的版本(当前最新 v0.2.40),此后本分支内可以直接覆盖安装;如果你手上还是 v0.2.21~v0.2.31 之间的版本,先备份设置,必要时卸载重装。另外,别把 v0.2.30/v0.2.31 的包当作 v0.2.21 的升级包安装——签名不一样,装不上还会被系统拦下。

还有一条硬边界

Legacy 的中文 README 自己写得很清楚:

验证边界:最低安装版本不等于真机连接保证。 当前 T3 / Android 4.4 适配基于 API 19 软件检查和模拟器专项测试;尚未完成该 T3 车机与 iPhone 15 Pro / iOS 26.6 的 USB、蓝牙、热点、画面、声音和触控全链路验证。

也就是说:能装上 ≠ 真机能连。模拟器检查不覆盖 T3 的 USB 驱动、蓝牙 RFCOMM、射频行为、iPhone 配件接受判定、HUD 集成和持续音视频,别拿「安装成功」当「链路通了」的证据。

五、安装与连接

第一步:装对包

装之前先确认三件事:车机允许安装第三方 APK;装在车机上,不是装在 iPhone 上;如果车机上已经装过其它版本的 DiPlay(包括上游原版、第三方修改版),先完全卸载——不同作者的签名私钥不同,直接覆盖会被系统报「签名冲突 / 与已安装应用签名不一致」。

第二步:有线(USB)

  1. 先处理原厂投屏软件的占用。很多老车机出厂自带「亿连」「CarLife」「Zlink」等后台守护进程,开机后抢先霸占 iPhone 的 USB 接口。到车机 设置 → 应用管理 里把原厂投屏程序强行停止,或关掉它的自启动权限。

  2. 拔下 iPhone 数据线,打开 DiPlay 进入等待连接界面。

  3. 把 iPhone 插到车机主 USB 数据口(支持互联的那个口,纯供电口不行)。

  4. iPhone 弹出「信任此电脑」时点信任,如果系统要本地 VPN 权限也一并允许——这个本地 VPN 承载的是 USB 网络链路,不是联网用的 VPN。

如果 iPhone 每隔几秒就断一次并自己重连,可以去 设置 → 连接 → USB 连接 → iPhone 充电 调成 Reduced 或 Low,代价是充电变慢。

第三步:无线

无线支持三种模式,按官方推荐顺序:

  • 车机热点(默认推荐):设置 → 连接 → 连接设置 → 内置车机热点,把车机热点开在 5 GHz,保存准确的热点名与密码;iPhone 打开蓝牙和 Wi-Fi 并与车机配对,然后点连接手机。走这条路时车机自己的 Wi-Fi 客户端是关着的,这一点很关键——车机只有一个射频,客户端在搜网时会离开 CarPlay 信道,造成周期性卡顿。

  • Wi-Fi Direct:Android 7.1+ 可用,前提是车机固件实现了相关 API。Android 7.1~9 走的是固件相关的旧路径,无法校验协商频率;Android 10+ 才会校验协商频率。旧路径的分组凭据是系统生成的,可靠性依固件而定,不稳就换回车机热点。

  • 同一局域网(Existing Wi-Fi / Same LAN):车机和 iPhone 连同一个外部路由,注意关闭路由器的客户端隔离,然后在设置里保存该网络。DiPlay 不会替你加入网络或改默认路由。

六、设置与排错

主要设置项分布在:显示(分辨率、帧率、图标/文字大小、界面大小、画面调整)、音频(路由、音乐缓冲)、导航、车辆(手势、方向盘按键)、连接(传输方式、开机自启、权限)、高级(实验性显示/媒体与车辆数据)、诊断(导出报告)。

调参建议直给:先从 30 fps + 默认图标大小起步,高级 → 视频与音频 里的 高效视频(HEVC) 保持关闭;车机偏慢就试 80% 或 60% 分辨率。改分辨率、帧率、图标大小这类会重连的设置,界面上的取消会保留旧值,什么都不选是不会生效的。

高级 → 视频与音频 下那一批实验性开关默认全是关的——平滑视频、缓冲音乐、通话回声消除、清晰通话人声、低延迟解码、直接视频输出。其中平滑视频会引入自适应延迟、可能让触控响应变迟钝,并且会禁用画面调整;这些开关要么立刻重连,要么下次连接才生效,按描述来。

排错清单

现象

可能原因

处理

提示「解析程序包出现问题」

车机真实 Android 版本低于所选包的 minSdk;或老系统装不了 v2-only 签名包

用 headunit-version-inspector 查真实 API Level,低于 25 换 Legacy 包;4.4/6.0 必须用 v1+v2 双签版本

「签名冲突 / 与已安装应用签名不一致」

之前装过其它作者构建的 DiPlay

到应用管理里完全卸载旧版再装

覆盖安装报 INSTALL_FAILED_UPDATE_INCOMPATIBLE

你装的是 v0.2.24~v0.2.31 里误用 Debug 证书的包

升到 v0.2.32+ 后即可正常覆盖;旧版本先备份再卸载重装

有线一直卡在「CarPlay控制通道运行中」

NCM 层 NDP 邻居发现死锁(TUN 三层设备不应答 NA)

升到含 v0.2.38 修复的版本;同时确认车机 USB 是数据口

有线每隔几分钟断一次

USB 读取与 DiPlay 停止等待的竞争;或 USB 音频驱动占着 iPhone

主线升到 v0.2.18;仍断就把 iPhone 充电档位调到 Reduced / Low

无线画面正常但声音从手机出来

AirPlay 未声明 Opus 支持,iPhone 把音频路由回手机

升到含 v0.2.38 修复的版本

无线每隔几秒卡一下

车机 Wi-Fi 客户端在周期性搜网,把射频从 CarPlay 信道带走

改用内置车机热点(客户端关闭),或升级到支持「网络 ADB 已授权时暂停自动加入」的版本

老车机找不到 iPhone 蓝牙

低版本系统没有 BluetoothLeScanner

在设置里手动填入车机蓝牙 MAC 地址完成握手

界面是空的 / 卡在启动

Android 5.0 以下主题或 API 兼容问题

用 Legacy 分支(含 Holo 回退与 API 判断)而不是主线包

报问题时先在最新版上复现,然后走 设置 → 诊断 → 保存诊断报告 导出 .txt。Android 10+ 通常存到 Downloads/DiPlay;Android 7.1~9 会请求存储权限后存到同一位置,低版本分支从 v0.2.27 起还会自动同步写入插上的 U 盘及 SD 卡根目录 /mnt/sdcard/DiPlay/。附 issue 时注明车型/车机、DiLink 与完整固件版本、iPhone/iOS 版本、连接方式、相关设置、复现步骤与故障时间——报告不会自动上传,但发之前记得删掉热点密码和私有认证文件。

DiPlay 设置界面
DiPlay 设置界面

七、安全与合规边界

这一段建议完整读完再决定装不装,官方把所有 README 里都强调了这些:

  • 不是 Apple 认证产品。APK 内置的是从公开 Carlinkit 固件里恢复出来的实验性配件身份,不是为 DiPlay 新签发的 MFi 身份。

  • 内置私钥可被提取。未来 iOS 更新后是否继续接受、跨车机的可靠性、该身份是否适合公开分发,都是未解决的问题。

  • CN 分支的发布签名密钥已公开,所以 Android 显示「签名一致」不能证明 APK 来自这个项目——只从项目列出的发布页下载。

  • 项目与 Apple Inc.、比亚迪均无隶属或授权关系;「CarPlay」「BYD」是各自所有者的商标,仅作兼容性描述使用。

  • 上游明确不支持比亚迪以外的品牌。其他品牌能跑是运气,不是承诺。

八、写在最后

DiPlay 的价值在于它把「老车机 + 无 CarPlay」这个死局打开了一个口子:一台 Android 4.4 的全志 T3 车机,和一个 iPhone,中间不需要额外硬件。代价是它始终是 public preview 且非官方认证,低版本线更是明确标注「最低安装版本不等于真机连接保证」——适合愿意折腾、会看诊断报告、能接受偶尔翻车的车主;如果你需要的是开箱即用、坏了有人负责的方案,还是老老实实买认证过的车机或 dongle。

相关链接

  • 官方主线仓库:https://github.com/shihabal3amri/DiPlay

  • 主线最新版 v0.2.18:https://github.com/shihabal3amri/DiPlay/releases/tag/v0.2.18

  • 7.1+ 分水岭版本 v0.2.15:https://github.com/shihabal3amri/DiPlay/releases/tag/v0.2.15

  • 低版本分支仓库:https://github.com/programmerguohuajing/DiPlay-Legacy-Android

  • 低版本最新版 v0.2.40:https://github.com/programmerguohuajing/DiPlay-Legacy-Android/releases/tag/v0.2.40

  • 低版本签名兼容说明:https://github.com/programmerguohuajing/DiPlay-Legacy-Android/blob/main/docs/RELEASE_SIGNING.md

  • 低版本兼容性矩阵:https://github.com/programmerguohuajing/DiPlay-Legacy-Android/blob/main/docs/COMPATIBILITY.md

  • 中文增强版:https://github.com/serein-morii/DiPlay-CN

  • CN 最新版 v0.2.18-cn.3:https://github.com/serein-morii/DiPlay-CN/releases/tag/v0.2.18-cn.3

  • 零跑适配分支:https://github.com/Wh1t3co1azZ/DiPlay-Leapmotor

  • 车机真实 Android 版本检测工具:https://github.com/493330227-wq/headunit-version-inspector

END