如何在Ubuntu或WSL2中, 通过网络访问Windows的ADB设备?

499 阅读3分钟

前言

有时在开发时, 有时会有"远程访问"ADB设备的需求. 比如:

  1. 在 Ubuntu 服务器上编译出的文件想 push 到 Windows 开发机上通过USB连接的设备.
  2. WSL2 下访问 Win 上的设备

现有方法及问题

一般的方法有这几种:

  1. 通过 Samba 或 SSH 将文件共享到 Win, 再在 Win 上输入命令 push
  2. 将设备的 WIFI adb 打开, 在 Ubuntu 上直接使用 WIFI adb 连接

第 1 种方式比较繁琐, 而且无法做到在服务器端通过脚本一键编译+push.
第 2 种大部分情况也是可用的, 但 WIFI adb 比较依赖无线, 有时速度比较慢, 而且开启设备的 WIFI adb 有时也比较麻烦, 有些设备也并不支持 WIFI.

还有第3种方式是通过运行特殊的 adb server 来做到, 一般搜 WSL2 访问都可以搜到

# Win 端
adb -a -P 5037 nodaemon server

# Linux 端
export ADB_SERVER_SOCKET=tcp:192.168.100.5:5037

这算是比较便捷的方式了, 但仍然有缺点.
因为这个启动独立服务的方式, 很容易和其它开发工具冲突, 引起失效.
比如:

  • Android Studio 可能会自己重启 adb 服务
  • 一些使用了 adb 的工具也会启动自己的 adb, 如: AnLink

下面就介绍一下最终的解决方式

分析和改进

先分析下上面第3种方式的原理:
启动 adb 服务的命令为: adb -a -P 5037 nodaemon server
这条命令最关键的参数是 -a, 作用是不仅仅允许 localhost 连接, 允许所有连接.

所以 adb 的服务端本身是支持局域网连接的, 只是为了安全, 默认只允许本机访问.
这里就让我想到了端口转发, 可以解决不允许外部访问的问题, 所以现在的核心就是如何配置 Win 的端口转发.

在 Win 上配置端口转发就有很多种方式了, 我这里选择了使用 netsh 配置端口转发, 好处是不需要第三方工具.

配置的命令参考

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=5038 connectaddress=127.0.0.1 connectport=5037

这里配置了一个将外部端口5038的访问, 转发到了5037端口, 具体的参数含义大家可以在网上搜.

然后在 Ubuntu 或 WSL2 中, 配置环境变量: export ADB_SERVER_SOCKET=tcp:192.168.100.5:5038 就可以使用 adb 访问 Win 主机连接的 adb 设备了.
这里 Win 主机的IP是 192.168.100.5, 需要根据实际情况进行修改.

经过这样配置后, 解决了前面说的服务会容易被其它应用干扰的问题, 已经可以愉快的使用了!

一些提示:

  1. 这样的方式被其它客户端连接时, Win 主机上是没有任何提示的, 需要注意不要被乱用了.

这里提供删除端口转发和查看端口转发的命令做参考:

# 删除5038端口的转发
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=5038

# 查看已配置的端口转发
netsh interface portproxy show v4tov4
  1. Ubuntu 或 WSL2 中的 adb 版本需要和 Win 主机上一致, 否则会报错, 可以使用 adb --version 查看