无需 root 的写入原理——Android API 是怎么做到的
为什么其他刻录 APP 大多需要 root
在 EtchDroid 出现之前,Android 上也有不少镜像刻录工具。它们几乎都需要 root 权限,原因很简单——
向 USB 设备的原始扇区写入数据,在传统的 Linux 权限模型里属于特权操作,需要访问 /dev/block/sdX 这样的块设备节点。普通应用没有权限直接写这些节点。
EtchDroid 走的是 Android USB Host API
EtchDroid 的核心技巧是避开 Linux 原始块设备,走 Android USB Host Framework。这套 API 从 Android 3.1(API 12)开始提供,允许应用在用户显式授权的前提下,通过 USB 接口与外设进行通信。
具体来说:
- 手机作为 USB Host,U 盘作为 USB Device
- EtchDroid 通过
UsbManager获取 USB 设备列表 - 用户点击授权对话框后,EtchDroid 拿到 USB 连接句柄
- 通过 USB Mass Storage Class 协议直接读写 U 盘的扇区
整个过程完全在 Android 沙箱内完成,不碰任何需要 root 的 Linux 系统调用。
底层用的是什么库
EtchDroid 在底层使用了 libaums(Android USB Mass Storage Library),这是一个 Java/Kotlin 实现的 USB MSC 协议栈。v1.4 版本之后,它进一步切换到了 libusb,对各种 USB 设备的兼容性和稳定性都有明显提升——这也是为什么 v1.4 之后用户普遍反馈"以前用不了的 U 盘现在能用了"。
为什么仍然存在兼容性边界
虽然走的是 Android 官方 API,但 EtchDroid 依然有一些硬限制:
- 内部 SD 卡槽不支持:Android API 不允许应用通过 USB Host 方式访问内部 SD 卡槽的控制器,这条路走不通。其他 APP 能用的"绕过"方法本质上就是 root——而 EtchDroid 明确承诺永远不做 root。
- 部分 USB 集线器不工作:集线器涉及额外的供电和协议转换层,某些手机 + 某些集线器的组合会出现识别不稳定。
- Thunderbolt-only 设备不支持:Android USB Host 只支持 USB 协议,Thunderbolt 设备需要额外的桥接芯片才能被识别为 USB 设备。
这些都不是 EtchDroid 的 bug,而是 Android USB Host API 和硬件本身的边界。