Skip to content

Repository files navigation

蓝牙全格式接收(BluetoothAcceptAll)

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,在其进程内完成两层拦截:

  1. MIME 推导层:hook android.webkit.MimeTypeMap.getMimeTypeFromExtension,将用户勾选的扩展名映射为合法 MIME(apk 映射为真实的 application/vnd.android.package-archive,其余映射为标记 MIME),避免"类型未知"被提前拒绝;
  2. 白名单校验层: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

安装与使用

  1. 安装 APK(所有正式版本使用同一签名证书,可直接覆盖升级);
  2. 在 LSPosed 管理器中启用本模块,作用域选择「蓝牙」(模块已声明静态作用域,也可在 App 内按引导申请);
  3. 重启手机使模块生效;
  4. 打开 App,勾选允许接收的格式,或按需开启「允许所有格式」;
  5. 通过蓝牙发送文件即可正常接收,文件一般保存在「内部存储/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.propminApiVersion=101staticScope=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  # 跨进程配置下发 + 心跳记录

免责声明

本模块仅供学习与技术研究使用。解除蓝牙格式限制会降低设备的入口安全性,请只接收来源可信的文件。使用本模块造成的一切后果由使用者自行承担。

License

GPL-3.0


本项目由 AI 持续辅助开发,如有错误,欢迎批评指正。

About

一个基于 LSPosed (libxposed 现代 API 101)的 Xposed 模块,用于解除原生 Android / LineageOS 蓝牙(OPP)接收文件时的格式限制,让手机可以通过蓝牙接收 APK、APKS、 APKX 乃至任意格式的文件。

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages