一、背景

众所周知,现如今市面上90%以上的家用电视或者盒子,本质上其实是一台安卓设备,而安卓有一个强大的调试工具——ADB(Android Debug Bridge)。通过ADB,你可以卸载任何预装App、安装任意APK、执行系统命令,甚至模拟遥控器按键。

但传统的ADB使用方式需要:一台电脑 + 安装ADB驱动 + 敲命令行。光是第一步就把大多数人劝退了。

我们开发了一款小程序 「微调试」,它把ADB的全部功能搬到了微信里。

你只需要:

  1. 手机和电视连接到同一个Wi-Fi

  2. 在电视上开启“USB调试”

  3. 打开微信小程序,输入电视的IP地址

然后,你就可以在手机上:

  • ✅ 一键卸载电视自带的垃圾应用

  • ✅ 从微信聊天记录选择APK,直接推送到电视安装

  • ✅ 浏览电视文件系统,上传/下载文件

  • ✅ 执行Shell命令

  • ✅ 实时截屏、查看日志、远程控制

完全不需要电脑,不需要数据线,甚至不用下载任何APP,用完即走!

不多废话,扫码即刻体验(如图片无法展示,可在微信中搜索“微调试”,或前往开源代码库https://gitee.com/doraemonhc/we-adb查看):

二、传统 ADB 编程方式的局限

大多数程序使用 ADB 的方式是:在系统中安装 Google 提供的 ADB 可执行文件,然后通过命令行参数调用它

adb pull /sdcard/DCIM/Camera .
adb install app.apk
adb shell pm list packages

这种方式的缺点不言而喻:

  • 环境依赖:系统必须预装 ADB 驱动,并提供可执行文件。

  • 进程开销:每次调用都启动新进程,效率低。

  • 输出解析困难:命令输出为字符串,不同设备格式不一致(例如 ls 的输出)。

  • 难以嵌入:无法在浏览器、小程序等受限环境中直接运行。

三、Tango ADB 的传输层设计

Tango ADB 是一个用 TypeScript 重新实现的 ADB 协议栈。它提供了两种底层传输模式,用于与 Android 设备建立通信。

2.1 Server Transport:对接 Google ADB Server

text

┌──────────┐     TCP:5037      ┌────────────┐    USB/TCP     ┌────────┐
│  Tango   │ ◄────────────────►│ ADB Server │ ◄────────────► │ 设备   │
│  Client  │                    │ (Google)   │                │ adbd   │
└──────────┘                    └────────────┘                └────────┘

原理:Tango 直接连接本地已运行的 ADB Server的 TCP 5037 端口,发送标准 ADB 协议消息。这种方式仍然需要 Google ADB 可执行文件(用于管理设备连接),但 Tango 绕过了命令行,实现了更高效的编程式交互。

支持平台

  • Node.js:✅

  • Electron:✅

  • Web:⛔需要一个本地化的“桥接”程序(将 TCP 转为 WebSocket)

2.2 Daemon Transport:直连设备 adbd(无需 ADB Server)

text

┌──────────┐    TCP:5555       ┌────────┐
│  Tango   │ ◄────────────────►│ 设备   │
│  Client  │     or WebUSB      │ adbd   │
└──────────┘                    └────────┘

原理:Tango 直接与 Android 设备上的 adbd 守护进程建立连接(通过 TCP 5555 端口或 WebUSB),完全不需要 Google ADB 可执行文件

优势

  • 无环境依赖:无需安装任何 ADB 工具。

  • 支持 WebUSB:在现代浏览器中直接通过 USB 连接设备,无需驱动。

  • 跨平台:同一套代码可运行在 Node.js、Electron、浏览器等环境。

支持平台

平台 USB 连接 ADB over Wi-Fi
Web ✅ (WebUSB) ⛔需桥接程序
Node.js
Electron

四、两种传输模式对比

特性 Server Transport Daemon Transport
是否需要 Google ADB ❌ 需要 ✅ 不需要
设备发现 通过 ADB Server 的 devices 列表 手动指定 IP 、通过 USB 枚举或 mDNS
连接方式 连接本地 TCP 5037 直连设备 TCP 5555 或 WebUSB
Web 支持 需桥接程序 USB 方式原生支持 WebUSB
认证流程 ADB Server 已处理 Tango 内置 RSA 密钥交换
适用场景 复用现有 ADB 环境的桌面应用 纯 Web 环境、无需预装 ADB 的工具

可以看出,Daemon Transport不需要Google ADB Server,非常适合轻量化、无需预装 ADB 工具的纯 Web 环境。

然而,ADB 协议基于更底层的TCP,浏览器只支持 HTTP 或 WebSocket,因此无法直接复用后者的连接方式,尽管Chrome 曾尝试通过 chrome.socket 等 API 提供 TCP 支持,但随着 Chrome App 生态的废弃,这些 API 也基本退出了历史舞台。后续提出的 Direct Sockets API 至今仍争议不断,并且仅限于高隔离度的特殊 Web 应用,普通网页无法使用,因此ADB适配Web网页仍面临诸多难题。

好消息是,微信小程序提供了TCP套接字,能够直接使用 wx.createTCPSocket 建立 TCP 连接,这让我们可以绕过浏览器在套接字 API 上的限制,实现小程序端与设备 adbd 的直接通信,无需任何中间代理。

五、实际应用:微信小程序中的 ADB 工具

基于 Tango ADB 的 Daemon Transport,实现小程序直连adbd,其架构如下所示:

text

┌───────────────┐      TCP (wx.createTCPSocket)       ┌─────────────┐
│  微信小程序    │ ◄────────────────────────────────► │  安卓设备    │
│  (Tango Client)│                                     │   (adbd)    │
└───────────────┘                                     └─────────────┘

核心流程

  1. 将小程序底层的 Socket 封装成 AdbDaemonDirectSocketsDevice,供上层调用

  2. 调用 wx.createTCPSocket() 建立与设备 IP:5555 的 TCP 连接。

  3. 使用 Tango 内置的认证模块adbDaemonAuthenticate完成 ADB 协议握手(RSA 密钥交换)。

  4. 认证通过后,直接发送 ADB 协议帧(OPENWRTECLSE 等),并解析返回的 OKAYDATA 等响应。

const device = new AdbDaemonDirectSocketsDevice({
    host: '192.168.116.209',
    port: 5555
});

let adbInstance = {
    value: null
};

// 导出一个Promise,在需要时初始化adb实例
const initAdb = async () => {
    if (adbInstance.value) {
        return adbInstance;
    }
    
    try {
        const connection = await device.connect();
        const transport = await adbDaemonAuthenticate({
            serial: 'device.serial',
            connection,
            credentialManager: new CustomLocalStorageCredentialManager('adb-credentials'),
        });
        adbInstance.value = new Adb(transport);
        return adbInstance.value;
    } catch (error) {
        console.error('初始化adb失败:', error);
        throw error;
    }
};

六、总结

Tango ADB 通过两种传输模式,将 ADB 能力从命令行剥离出来:

  • Server Transport 适合需要兼容现有 ADB 环境的桌面应用;

  • Daemon Transport 则彻底解放了 ADB,使其能够运行在浏览器、小程序等新兴平台。

对于开发者而言,这意味着 ADB 不再是操作系统的外部依赖,而可以成为任何 JavaScript 应用的内置模块。


参考链接

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐