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(预发布)。不同作者的分支签名证书各不相同,互相不能覆盖安装,这一点是后面所有安装坑的根源。

二、按车机版本选分支
这是全文最重要的一张表。分支不同不等于版本新旧——Legacy 的 v0.2.40 数字比主线 v0.2.18 大,但它服务的是更老的车机,两者是并行的两条线,不是前后关系。
车机 Android 版本 | 该用哪个 | 当前 tag | 装机门槛 |
|---|---|---|---|
Android 7.1 及以上 |
| v0.2.18 |
|
Android 7.1 及以上,要中文增强 |
| v0.2.18-cn.3 | 基于上游 v0.2.18 |
Android 4.4 ~ 6.0 |
| v0.2.40 |
|
零跑 2021–2023 车型 |
| 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 集成和持续音视频,别拿「安装成功」当「链路通了」的证据。
五、安装与连接
第一步:装对包
官方主线:从 v0.2.18 release 下载
DiPlay-0.2.18.apk,官网同样提供链接。低版本:从 Legacy 最新 release 下载,按车机芯片选通用版、ARMv7 专版或 x86 专版。
中文增强:
DiPlay-CN另有 Gitee 国内镜像,下载更快。
装之前先确认三件事:车机允许安装第三方 APK;装在车机上,不是装在 iPhone 上;如果车机上已经装过其它版本的 DiPlay(包括上游原版、第三方修改版),先完全卸载——不同作者的签名私钥不同,直接覆盖会被系统报「签名冲突 / 与已安装应用签名不一致」。
第二步:有线(USB)
先处理原厂投屏软件的占用。很多老车机出厂自带「亿连」「CarLife」「Zlink」等后台守护进程,开机后抢先霸占 iPhone 的 USB 接口。到车机
设置 → 应用管理里把原厂投屏程序强行停止,或关掉它的自启动权限。拔下 iPhone 数据线,打开 DiPlay 进入等待连接界面。
把 iPhone 插到车机主 USB 数据口(支持互联的那个口,纯供电口不行)。
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 版本低于所选包的 | 用 |
「签名冲突 / 与已安装应用签名不一致」 | 之前装过其它作者构建的 DiPlay | 到应用管理里完全卸载旧版再装 |
覆盖安装报 | 你装的是 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 蓝牙 | 低版本系统没有 | 在设置里手动填入车机蓝牙 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 版本、连接方式、相关设置、复现步骤与故障时间——报告不会自动上传,但发之前记得删掉热点密码和私有认证文件。

七、安全与合规边界
这一段建议完整读完再决定装不装,官方把所有 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
