前言
有时在开发时, 有时会有"远程访问"ADB设备的需求. 比如:
- 在 Ubuntu 服务器上编译出的文件想 push 到 Windows 开发机上通过USB连接的设备.
- WSL2 下访问 Win 上的设备
现有方法及问题
一般的方法有这几种:
- 通过 Samba 或 SSH 将文件共享到 Win, 再在 Win 上输入命令 push
- 将设备的 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, 需要根据实际情况进行修改.
经过这样配置后, 解决了前面说的服务会容易被其它应用干扰的问题, 已经可以愉快的使用了!
一些提示:
- 这样的方式被其它客户端连接时, Win 主机上是没有任何提示的, 需要注意不要被乱用了.
这里提供删除端口转发和查看端口转发的命令做参考:
# 删除5038端口的转发
netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=5038
# 查看已配置的端口转发
netsh interface portproxy show v4tov4
- Ubuntu 或 WSL2 中的 adb 版本需要和 Win 主机上一致, 否则会报错, 可以使用
adb --version
查看