USBManager — Android USB 管理模块

English

一个基于 LSPosed 框架的 Android 系统模块,每次用数据线连接电脑时弹出 USB 选择器,让你即时决定本次的 USB 模式与是否开启 ADB。

现已移除「设备识别 + 记忆」功能。ADB 设备端无法可靠读取主控端(电脑)的 PID/VID,导致不同电脑之间可能被错误识别为同一台、从而套用别的电脑配置。因此本模块不再记忆任何电脑,改为每次连接都弹窗

功能

  • 自动检测连接:Hook UsbDeviceManager(辅以系统 USB_STATE 广播双路径),检测手机以设备模式连接电脑的事件

  • 每次连接弹窗:每次连接电脑都弹出 USB 选择器,选择本次的 USB 模式与 ADB 开关,不再记忆/自动套用

  • 多种模式:仅充电 / 文件传输 (MTP) / 图片传输 (PTP) / USB 网络共享 (RNDIS) / MIDI

  • ADB 一键开关:在弹窗中决定本次是否开启 USB 调试

  • OTG 不弹窗:手机作为 USB 主机(OTG 接入 U 盘、键鼠等)时不弹窗,交由系统原生识别,也无需开启 ADB

  • 拔线自动关 ADB:拔出数据线后自动关闭 ADB(可关闭该行为),确保 adbd 停止

  • Root 回退:当框架 API 不可用时自动尝试 su 命令写入系统属性(要求能使用 root 权限)

安装

前置条件

  • 已解锁 Bootloader 并 Root 的 Android 设备

  • 已安装 LSPosed

  • Android 12+(推荐)或 11

步骤

  1. Releases 下载最新 APK
  2. 安装 APK 到设备
  3. 打开 LSPosed Manager → 模块列表 → 勾选 USBManager
  4. 作用域:勾选 system(系统框架)
  5. 重启设备
  6. 从桌面启动 USBManager 应用,查看使用说明与模块设置

使用

  1. 插入 USB 数据线连接到电脑
  2. 每次都会弹出 USB 选择器(如锁屏/后台受限,则以高优先级通知全屏弹出)
  3. 选择 USB 模式(仅充电 / 文件传输 / 图片传输 / 网络共享 / MIDI)和 ADB 开关
  4. 点击「确定」生效

默认设置

  • 默认 USB 模式:仅充电

  • 默认开启 USB 调试:关闭

  • 拔线自动关闭 ADB:开启

  • 锁屏时是否弹出选择窗口:关闭(默认解锁后再弹)

可通过 USBManager 应用修改默认值。

升级说明:从旧版本升级后,首次启动会清除旧版本保存的电脑识别数据(usbmanager_hosts 及 system_server 侧的 fallback 副本),避免残留数据影响新行为。

构建

# 克隆仓库
git clone https://github.com/your-username/USBManager.git
cd USBManager

# 使用 Gradle 构建
./gradlew :app:assembleRelease

调试

查看日志

模块日志输出到 USBManager tag。可通过 LSPosed Manager 查看:

  1. 打开 LSPosed Manager
  2. 点击 日志 → 搜索 USBManager
  3. 查看相关日志

或者使用 ADB Logcat:

adb logcat -s USBManager

关键日志标签:

  • [WATCHER] — USB 事件处理流程

  • [RX] — 广播接收器

  • [HOOK] — Hook 初始化

  • [CLIENT] — ContentProvider 通信

  • [CONTROLLER] — USB 模式/ADB 配置应用

许可证

本项目使用木兰公共许可证,第 2 版(Mulan PubL v2)。 完整授权见 LICENSE

源码与发布

Releases

Version 4

Stable

9/12/2026, 7:27:46 AM

🐛 修复

Android 16 / 部分定制 ROM 开机崩溃:注入阶段 system_server 的 Context 尚未完成初始化导致 HostProviderClient 空指针、注册广播时 ActivityManagerService 尚未就绪导致注册失败。现改用 ActivityThread.getSystemContext() 直接引导初始化,注册广播前先轮询等待 AMS 就绪,Application.attach 保留为兜底路径。(感谢 @GADDQ 提交 PR #3)

🔧 优化

开启 Release 构建 R8 代码混淆与资源压缩:减小包体积、提高安全性,并新增完整 ProGuard 保留规则(模块入口、system_server hook 反射路径、Gson 跨进程载荷、UsbMode 枚举)。

开启 staticScope 静态作用域注入,避免误勾选。

修正软件内部分语言表述问题。

Assets

2

Version 3

Stable

9/7/2026, 9:57:44 AM

⚠️ 重要变更

移除「设备识别 + 记忆」功能:由于ADB 设备端无法读取主控端 PID/VID,不同电脑会被误判成同一台并套用别的配置。现改为每次连接都弹窗选择,不再记忆、不再自动套用;OTG(手机作为 USB 主机)保持不弹窗。升级后自动清理旧版已保存的识别数据。
如果您有比较好的识别方案,欢迎提交Issue我们一起讨论!


✨ 新增

锁屏弹窗开关(默认关闭):锁屏插入时先不弹,解锁后再自动弹出,规避后台启动限制并避免锁屏泄露信息。 中英双语:界面与通知文案跟随系统语言切换。

🔧 优化

跨进程鉴权:以调用方 UID 白名单(system 1000 与模块自身)为准,BRIDGE_TOKEN 降为纵深防御;选择器通知可见性改为 SECRET。 动态广播兼容:适配 SDK 33+ 的 exported 标志(bridge 用 RECEIVER_EXPORTED、USB_STATE 用 RECEIVER_NOT_EXPORTED),修复广播注册失败。 移除死代码反射路径,统一默认模式取值与展示。

🐛 修复

确认后又弹一次窗口:应用配置触发 USB 重新枚举被误判为新连接。新增 3s 抑制窗口并清理残留 pending-apply,确认后不再重复弹窗、拔线后不再闪窗。 拔线后选择器残留:新增 ACTION_DISMISS_CHOOSER 广播,拔线时主动关闭仍在屏上的选择器。 默认「仅充电」不一致:统一为 CHARGING。

Assets

2

Version 2

Stable

8/28/2026, 4:57:38 PM

已知bug:

无法正确识别不同设备,对于不同设备都只会套用已保存的设备策略。(预计下个版本修复)


🔧 优化

ADB 状态管理:连接时按策略开启 ADB,拔线后保证 adbd 守护进程彻底关闭。
跨进程通信改用 BRIDGE_TOKEN 鉴权,移除签名权限依赖,兼容 system_server 调用。
原生落地 JSON 统一走 Gson 单例,删除手写转义。
清理死代码、补齐空 hostKey 保护、轮询命中提前结束、确认宽限窗口对齐 30s。

🐛 修复

ADB 关闭时连接已保存电脑会反复开关约 3 次后才常开
应用配置触发 USB 重新枚举,产生瞬时 DISCONNECTED→CONNECTED;现对断开事件加入 800ms 去抖,上升沿会自动取消挂起的断开动作,ADB 不再闪烁。
ADB 开启时拔线会先弹“USB 调试已连接”通知
改为优先通过框架 AdbService 驱动 ADB(统一管理设置、adbd 与通知生命周期),不再绕过导致通知悬空。

Assets

2