作者:bqj6666 | 版本:alpha2.38.9(versionCode 269) | 许可证:GPL-3.0(见 LICENSE)
Moondrop 蓝牙耳机助手:耳机连接时自动弹出 Fast Pair 卡片,并通过 GAIA BLE 协议直连耳机读取状态、控制降噪。项目本体是一个 LSPosed / Xposed 模块。
AI vibe coding声明:本项目应用代码部分使用 AI 辅助生成,代码已经开发者人工审查与实机验证,但仍可能存在逻辑错误、安全缺陷或兼容性问题。请仔细核对代码后再使用,使用风险自负。
逆向声明:本项目借助利用 Moondrop App(
com.moondroplab.moondrop.moondrop_app)的私有接口实现耳机控制与状态读取,仅供学习研究使用。项目不包含 Moondrop App 的任何代码、资源或反编译产物;所有 hook 目标类名仅以字符串形式引用。请勿用于商业用途,使用后果自负。
- 蓝牙监听 + GAIA 直连:BLE GATT 直连耳机,读取左右耳电量,控制降噪
- ANC 型号档案库:
AncProfileLib按设备名自动套用实测设备码映射(如 GA2 实测 1=关/2=降/3=抗风/4=透传),未实测型号回退默认映射;设置页可自定义映射优先生效 - FastPairHook(LSPosed 模块,注入 Google Play 服务):借道 GMS 的 BLE 扫描能力动态发现耳机 LE 地址并推送给应用
- 自愈闭环:无缓存 → REQ 扫描 → GMS 推送 → 连接成功写回文件 / SP → 下次秒连;地址变化自动重新发现(地址全动态发现、零硬编码)
- 弹窗模式:Google Fast Pair 半屏弹窗(注入 GMS 的 HalfSheetActivity)
- M3 界面:主页(英雄卡 + 状态面板 + 降噪三按钮)、设置页(外观 / 通用 / 行为,随系统深浅色 + Material You 动态取色)、关于页,全部使用 Material 3 组件
- 权限检测(整页二级界面):蓝牙 / 通知 / 悬浮窗 / 电池白名单 / Root / FastPairHook / GAIA 直连 7 项实时检查,缺失一键跳转修复
- 日志抓取(设备适配):一键收集系统信息 / 应用设置 / 蓝牙 / 运行环境 / logcat 五类日志打包为 ZIP
- Root 强力保活、开机自启、后台隐藏(可选开关)
| 主页概览 | 设置 | 关于 | Fast Pair 弹窗 |
|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
| 项目 | 说明 |
|---|---|
| 语言 | Kotlin |
| 构建链 | Gradle 8.9(wrapper 固定)+ AGP 8.5.2 + Kotlin 1.9.22 |
| UI | Material 3,Theme.Material3.DayNight.NoActionBar+ 动态取色,三页 Fragment 架构 |
| 模块 | libxposed API 102(LSPosed ≥ 2.1.1,作用域 com.google.android.gms;com.android.settings) |
| 包名 | com.fxxkmoondrop.secret |
./gradlew :app:assembleRelease -PfxxkKeypass=<签名密码>- 产物:
app/build/outputs/apk/release/app-release.apk - Gradle
packaging.merges自动合并META-INF/xposed/*(java_init.list/module.prop/scope.list),构建后自动签名 - 签名密钥自备,构建时通过
-PfxxkKeypass=传入密码
- 安装 APK
- 在 LSPosed 中启用并勾选作用域
com.google.android.gms(可选com.android.settings) - 授予蓝牙 / 通知 / 悬浮窗权限(设置页「检查权限」可一键跳转修复)
- 弹窗默认 Google Fast Pair 半屏弹窗,也可在设置中切换为应用自带悬浮卡片
下表理论支持与未知的型号多为芯片级推断,尚未逐一实机验证。欢迎拥有对应耳机的用户可以帮忙连接一次并把结果反馈到 Issue
兼容性判定基于蓝牙传输层与服务指纹,不依赖型号名:
- 耳机暴露高通 GAIA 服务 via BLE GATT → 走 GAIA V3 协议
- 耳机暴露高通 GAIA 服务 via Classic BT RFCOMM/SPP → 走 GAIA V4 协议(如布丁 PUDDING)
- 耳机暴露 Moondrop 私有
9ECA0000服务 → 走私有协议(音源切换 / EQ / MIC / SN)因此只要主控为高通 QCC 或中科蓝讯(Bluetrum),理论上即可接入。
| 状态 | 耳机型号 | 主控 / 协议 | 依据 |
|---|---|---|---|
| ✅ 已实测 | 梦回2 / Golden Ages 2(GA2) | TWS-01 定制 SoC(GAIA) | 实机验证通过(ANC 设备码 1=关/2=降/3=抗风/4=透传 已入库) |
| 🟢 理论上支持 | 爱丽丝 ALICE | QCC5151(GAIA) | 芯片理论支持 |
| 🟢 理论上支持 | 火花 SPARKS | QCC3040(GAIA) | 芯片理论支持 |
| 🟢 理论上支持 | 旅行者 VOYAGER(颈挂) | QCC5144(GAIA) | 芯片理论支持 |
| 🟢 理论上支持 | 梦回1979 / Golden Ages | 与梦回2同平台同款主控(GAIA) | 芯片理论支持 |
| 🟢 理论上支持 | 猫饼 NEKOCAKE | BT8922E(9ECA) | 芯片理论支持 |
| 🟢 理论上支持 | 太空漫游2 / Space Travel 2 | BT8932F(9ECA) | 芯片理论支持 |
| 🟢 理论上支持 | 音乐胶囊 PILL | BT8932F(9ECA) | 芯片理论支持 |
| 🟢 理论上支持 | 超声波 ULTRASONIC | BT8952F(9ECA) | 芯片理论支持 |
| 🟢 理论上支持 | 知更鸟 Robin | BT8952F(9ECA) | 芯片理论支持 |
| ⚪ 未知 | 太空漫游 / Space Travel(一代) | 疑似中科蓝讯(型号未确认) | 待实机验证 |
| ⚪ 未知 | 猫咖 MOCA | 疑似蓝讯(蓝牙 5.4 / LC3 特征) | 待实机验证 |
| ⚪ 未知 | 方糖 BLOCK | 疑似蓝讯 BT8922 系 | 待实机验证 |
| ✅ 已实测 | 布丁 PUDDING(MD-TWS-056) | 国产 SoC(GAIA V4,RFCOMM/SPP) | 借助 PuddingPods 项目协议文档完成适配,5 档 ANC + 三路电量 + 增益 + 指示灯 |
| ⚪ 未知 | 太空漫游2 ULTRA | 国产 SoC(型号未公开) | 待实机验证 |
| ⚪ 未知 | 羽翼 EDGE / EDGE2 | 国产 SoC(型号未公开) | 待实机验证 |
- 已实测:开发者实机验证过
- 理论上支持:主控芯片已确认且协议侧能自动识别,但尚未逐一实机跑通
- 未知:主控未公开或被疑为蓝讯系,需连接耳机后看日志 GATT 指纹(
GAIA/9ECA0000)定论
Fast Pair 弹窗依赖完整的 Google Play 服务(GMS),能否弹出与手机系统的 GMS 完整程度有关,与耳机型号无关。模块自身无需单独安装 GMS 组件。
| 系统 | Fast Pair 弹窗 | 说明 |
|---|---|---|
| ✅ 已实测 | 类原生 / 原生系统(完整 GMS) | 功能完全正常 |
| ColorOS(OPPO / realme / 一加) | 需搭配 oplus-cn2global(Magisk 模块) + Luckytool(Xposed,解除 GMS 限制) 后 Fast Pair 弹窗才可用 | |
| ⚪ 待实测 | 其他系统 | 只要是支持完整 GMS 的系统,理论上均支持(尚未逐一实机验证) |
FxxkMoondrop-repo/
├── app/ # Gradle 应用模块(sourceSets 指向 ../src)
│ └── src/main/ # res / AndroidManifest.xml / resources/META-INF/xposed
├── src/ # 全部 Kotlin 源码(com.fxxkmoondrop.secret)
├── screenshots/ # README 用到的界面截图
├── gradle/ # Gradle wrapper(8.9)
├── build.gradle.kts # AGP 8.5.2 + Kotlin 1.9.22(apply false)
├── settings.gradle.kts # 模块声明与仓库
├── tools/ # 构建辅助脚本(post_edf.py:EDF 注入 + 重签)
├── ADAPTATION.md # 设备适配说明(协议知识 / 踩坑 / 实测数据)
├── ARCHITECTURE.md # 系统架构文档(进程模型 / 数据流 / 弹窗布局 / 协议)
├── DEVELOPMENT.md # 开发文档(构建环境 / 目录 / 版本规范 / 调试 / 发布清单)
├── CHANGELOG.md # 更新日志(按版本号逐条记录)
└── (无需 xposed-api-stub.jar) # 已改用 Maven 依赖 io.github.libxposed:api:102.0.0
项目在仓库根目录维护了多份开发文档,建议按需阅读:
| 文档 | 内容 | 适用场景 |
|---|---|---|
| ADAPTATION.md | 设备适配说明:协议知识、踩坑经验、实测数据、BLE/9ECA 帧格式、ANC 设备码映射、连接策略 | 新增耳机适配、排查连接/协议问题时阅读 |
| ARCHITECTURE.md | 系统架构:双进程模型、跨进程通信、核心模块、关键数据流、弹窗布局、协议架构与设计原则 | 理解项目整体设计、做较大改动前阅读 |
| DEVELOPMENT.md | 开发指南:构建环境与命令、签名与 EDF 作用域注入、目录结构、版本号规范、LSPosed 元信息、依赖清单、调试技巧、发布检查清单 | 本地编译、二次开发、提 MR 前检查 |
| CHANGELOG.md | 更新日志:按 alpha.x.y 逐条记录的功能、修复与逆向进度 |
查看版本演进历史 |
版本号格式采用
alpha.x.y:x为里程碑、y为迭代,versionCode单调递增。详见 DEVELOPMENT.md 版本号规范。
- JingMatrix 及其维护的 LSPosed / Vector 框架:本项目的界面与交互风格参考了 LSPosed Manager 的设计,特此致谢;项目亦受益于 LSPosed 生态的工具链
- LSPlant 与 Xposed / LSPosed 社区
- lingbai-rong/PuddingPods:通过该项目的协议逆向文档,FxxkMoondrop 完成了对水月雨布丁 PUDDING(MD-TWS-056)的适配——包括 GAIA v4 over RFCOMM/SPP 连接方式、5 档 ANC 设备码映射、三路电量(含充电盒)读取、增益与指示灯控制协议
- 各AI 协助进行开发
- alpha2.38.9(当前):借助 PuddingPods 协议文档完成布丁 PUDDING(MD-TWS-056)适配——GAIA v4 over RFCOMM/SPP 连接、5 档 ANC(关闭/自适应/通透/抗风/基础降噪)、三路电量含充电盒、增益与指示灯控制;并修复 SettingsFragment 重复
setContentView导致的弹窗自定义图标闪退 - alpha2.38.7:弹窗电量文字恢复写进 GMS 原生
subhead(耳机名下方、图标上方),移除自绘 overlay + 硬编码坐标;仅 subhead 缺失时兜底自绘,位置从PopupProfile屏幕布局库读取 - alpha2.38.5:修复弹窗电量显示丢失 + ANC 按钮无响应(模式条动态定位追踪 central_btn)
- alpha2.38.4:弹窗图标+模式面板整体上抬 140px,给设置按钮腾出空间
- alpha2.38.3:设置按钮完全克隆确定按钮 + 上方对齐
- alpha2.38.2:新增
PopupProfile数据类 +PROFILE_61/PROFILE_63两档配置,按屏幕分辨率自动选档 - alpha2.38:移除 PopupOverlay + 全部硬编码 UI 值修复
- alpha2.37:弹窗设置按钮对齐 + DC 自定义设置
- alpha2.31:Xposed 模块迁移至 libxposed API 102(适配 LSPosed ≥ 2.1.1)——
XposedEntry继承XposedModule,全部 hook 改用module.hook().intercept{},HookHelper纯反射替代XposedHelpers,资源声明迁移至META-INF/xposed/{java_init.list,module.prop,scope.list},Maven 依赖替代本地 stub jar - alpha2.26.10:GET/SET 双向映射分离——GA2 固件读回 0-based 直传(0=关/1=降/2=透/3=抗),与 SET 的 1-based 枚举(1/2/4/3)独立档案映射;修复读回 0 时按钮状态卡死
- alpha2.26.9:ANC 型号档案库
AncProfileLib——GA2 实测 1=关/2=降噪/3=抗风/4=透传,按设备名自动套用;未实测型号回退默认映射;自定义映射优先生效(仅 GAIA 路径,9ECA 蓝讯系不混用) - alpha2.26.8:连接修复——仅扫描确认的 LE 地址才持久化,连接成功先刷新 GATT 缓存(对齐官方 refreshDeviceCache)
- alpha2.26.7:回退 UNKNOWN→AudioCuration 违规链——「未知/未就绪」不再误发跨路径命令
- alpha2.26.2:ANC 按钮映射可配置化——设置页自定义设备码(0-5),默认 AC 1-based [1,2,3,4]
- alpha2.26:降噪控制重构后按钮错乱修复——
fetchAncMode真正改用cmd=3(GET_MODE),官方面板/主界面补齐第 4 模式「抗风」 - alpha2.25:能力探测回退 cmd=41→3——
fetchAncMode的 AudioCuration 路径改读cmd=3(GET_MODE)(GA2 对 cmd=41 回包不稳),已装机验证 - alpha2.24:官方 App 逆向证据落地——GA2 走 ANC_V2(0x20),按回包 feature 判定 ANC 路径不硬编码型号
- alpha2.23:降噪刷新「跳回关闭」修复——ANC 路径恒等映射 + ancPath 显式化 + 降噪读取改用 cmd=41(GET_CURRENT_ANC_SWITCH_CONF)
- alpha2.22:取消乐观更新 + 官方高通协议(AudioCuration)落地——能力位图截断检测、能力探测终态、主动只读探测、ANC 三态广播、cachedLe 绑设备名防串扰
- alpha2.21:连接锁到已学习 LE 地址,GA2 开盖 1.8s 秒连不再 12s 超时轮换
- alpha2.20:已学习 LE 地址优先于 bonded 主地址,避免拿 PUBLIC 地址走 LE 后台等广播
- alpha2.19:修复降噪控制“时好时坏”——能力探测标志永不重置导致
ancPath卡死在 -1,现改为断连与每次新 GATT 会话均重置并超时自愈重发 - alpha2.18:修复"耳机已断开仍显示已连接"的假连接问题(陈旧缓存作废 / 双地址自我反馈防护)
- alpha2.17:修复 GA2(DUAL)连接不上——按名称扫描真实 LE 地址,实现自愈闭环
- alpha2.16:接入 9ECA0000 完整协议客户端(音源切换 / EQ / MIC / SN),全链路运行日志
- alpha2.15:跨型号适配 + 官方 App 逆向证据补充
- alpha2.14:开源发布(GitHub)基础版
- alpha2.13:Kotlin 迁移 28/28 完成(纯 Kotlin 源码);修复设置 / 关于页标题与状态栏重叠;修复切换 AMOLED 触发 recreate 后页面丢失;Gradle + AGP 工程化完成;clean 全量构建验证通过
- alpha2.12:M3 三页 Fragment 架构(主页 / 设置 / 关于)
- alpha2.0 及以前:单体 Activity + 旧打包链(历史版本不在本仓库)
本项目仅供学习与研究 Android 逆向与蓝牙协议使用,请勿用于任何商业用途或侵犯他人权益的行为。使用本项目造成的一切后果由使用者自行承担。



