English Version → README_EN.md
一个基于 LSPosed(libxposed 现代 API 101)的 Xposed 模块,用于解除原生 Android / LineageOS 蓝牙(OPP)接收文件时的格式限制,让手机可以通过蓝牙接收 APK、APKS、APKX 乃至任意格式的文件。
原生 Android 的蓝牙接收(Bluetooth OPP)对文件格式有白名单限制:接收文件时先按扩展名推导 MIME 类型,推导不出的直接拒绝;推导得出后再与系统白名单(ACCEPTABLE_SHARE_INBOUND_TYPES)比对,不在名单内的也拒绝。因此 APK 等安装包、脚本、压缩镜像等格式无法通过蓝牙传输。本模块通过 hook 蓝牙系统应用解除这层限制。
格式过滤相当于一道入口防火墙,解除限制后请务必只接收来源可信的文件。模块不会跳过系统的接收确认弹窗。
- 解除蓝牙接收格式限制,默认放行
apk/apks/apkx - 图形界面勾选允许接收的格式(内置约 30 种常见格式目录,含系统原始放行状态标注)
- 支持自定义扩展名
- 「允许所有格式」总开关:开启前弹窗风险提示,开启后其余控件自动锁定
- 配置即时生效,无需重启蓝牙(蓝牙进程每次传输时实时读取配置)
- 启动自检:自动检测 LSPosed 框架、模块启用状态与作用域,分级弹窗引导,并支持主动向框架申请作用域;服务接口不可用时通过蓝牙进程心跳兜底判定
- 跟随系统的深色模式、OLED 纯黑、状态栏/导航栏沉浸适配
- 可隐藏桌面图标(仍可从 LSPosed 管理器的模块设置入口进入)
- 自适应图标(含主题取色 monochrome 层)
模块作用域为系统蓝牙应用 com.android.bluetooth,在其进程内完成两层拦截:
- MIME 推导层:hook
android.webkit.MimeTypeMap.getMimeTypeFromExtension,将用户勾选的扩展名映射为合法 MIME(apk映射为真实的application/vnd.android.package-archive,其余映射为标记 MIME),避免"类型未知"被提前拒绝; - 白名单校验层:hook
com.android.bluetooth.opp.Constants.mimeTypeMatches全部静态重载,命中标记 MIME 或总开关开启时直接放行;同时反射修补ACCEPTABLE_SHARE_INBOUND_TYPES白名单数组作为静态兜底。
用户配置由模块 App 内导出的 ContentProvider(io.github.bluetoothacceptall.allowlist)提供,蓝牙进程在每次文件传输时实时查询,因此改动即时生效。
框架状态检测优先使用 libxposed service 接口(可读取框架版本、作用域并动态申请作用域);当服务接口不可用时,改由蓝牙进程 hook 向 Provider 发送的心跳判定模块真实激活状态。
- 已 Root 并安装 LSPosed(支持 libxposed API 101 的版本)
- Android 8.1(API 27)及以上,目标平台为 Android 15(API 35)
- 原生 / 类原生 ROM(AOSP、LineageOS 等),蓝牙栈为系统蓝牙应用
com.android.bluetooth
- 安装 APK(所有正式版本使用同一签名证书,可直接覆盖升级);
- 在 LSPosed 管理器中启用本模块,作用域选择「蓝牙」(模块已声明静态作用域,也可在 App 内按引导申请);
- 重启手机使模块生效;
- 打开 App,勾选允许接收的格式,或按需开启「允许所有格式」;
- 通过蓝牙发送文件即可正常接收,文件一般保存在「内部存储/bluetooth/」目录(实际路径与系统有关)。
# 需要 JDK 17+ 与 Android SDK(platforms;android-36、build-tools;35.0.0)
./gradlew :app:assembleDebug给模块开发者的提示:Android Studio 的部署优化(Apply Changes / 快速部署)会导致 Xposed 模块无法正常更新。请在 Android Studio 中禁用部署优化,或使用
./gradlew installDebug命令进行安装。本项目已在gradle.properties中设置android.disableAutomaticComponentCreation=true以禁用自动组件创建。
构建 Release 版本:
./gradlew :app:assembleRelease输出路径:app/build/outputs/apk/release/app-release.apk
- 模块入口:
app/src/main/resources/META-INF/xposed/java_init.list - 模块元数据:
app/src/main/resources/META-INF/xposed/module.prop(minApiVersion=101,staticScope=true) - 依赖:
io.github.libxposed:api:101.0.1(compileOnly)、io.github.libxposed:service:101.0.0
app/src/main/java/io/github/bluetoothacceptall/
├── HookEntry.java # hook 入口:双层拦截 + 白名单修补 + 心跳
├── MainActivity.java # 主界面:格式勾选、总开关、自定义扩展名
├── SettingsActivity.java # 设置:主题、OLED、隐藏图标、使用说明
├── FrameworkGate.java # 启动自检:框架/启用/作用域分级引导 + 心跳兜底
├── AppTheme.java # 颜色模式与系统栏适配
└── AllowListProvider.java # 跨进程配置下发 + 心跳记录
本模块仅供学习与技术研究使用。解除蓝牙格式限制会降低设备的入口安全性,请只接收来源可信的文件。使用本模块造成的一切后果由使用者自行承担。
本项目由 AI 持续辅助开发,如有错误,欢迎批评指正。