Tailscale + 无线 ADB:在任何地方远程调试 Android 设备
/ 5 min read
Table of Contents
背景
WFH 或外出时,需要调试不在身边的 Android 设备。与此同时,电脑 USB 口有限,在充电线和调试线之间反复切换也很繁琐。
核心需求:无论人在哪里,都能像设备在眼前一样完整调试。
思路
Android 原生支持无线 ADB(adb connect <ip>:5555),只要设备和电脑在同一局域网,连线就可以省掉。
问题出在”不同网络”这个前提上。解决方案是 Tailscale:一个基于 WireGuard 的 SD-WAN 工具,核心是 UDP P2P 打洞——借助一个协调节点帮两台设备建立直连,打不通时走中继转发。连上之后,手机和电脑处于同一虚拟内网,无线 ADB 直接能用。
手机(远端网络)─── Tailscale P2P/Relay ───电脑(本地/任意网) ↓ adb connect / scrcpy实践步骤
1. 安装并启用 Tailscale
- 电脑和手机都安装 Tailscale 客户端,登录同一个账号。
- 手机端:进入系统设置 → 开发者选项 → 无线调试,保持常开。Tailscale 也需要常驻后台。
- 电脑端:按需启动,无需常驻。
手机暴露的 ADB 端口默认是 5555。
2. 验证连通性
登录 Tailscale 控制台,可以看到所有设备及其虚拟内网 IP。Tailscale 的 Magic DNS 功能支持用主机名直接访问,例如 my-phone,与 IP 等价。
刚建立连接时流量先经海外 DERP 中继节点,延迟较高;随后会尝试 P2P 打洞,成功后延迟会显著下降并趋于稳定。
3. 连接 ADB 并投屏
# 建立 ADB 连接(主机名或 Tailscale IP 均可)adb connect my-phone:5555
# 投屏 + 远程操控(scrcpy)scrcpy -s my-phone:5555 --no-audio --port=27190:27200细节优化
手机使用访客/公开 Wi-Fi
访客网络通常隔离内网,但 Tailscale 走公网 UDP,只要出口通畅就行。如果访客网络封了 UDP,可以让 Tailscale 回退到 TCP 443。
中继节点优化(打洞失败时)
官方 DERP 节点在海外,打洞失败时延迟/拥塞会很明显。如果有国内公网服务器,可以自建 Peer-Relay 作为兜底:
# 在中继服务器上配置监听端口tailscale set --relay-server-port=22345注意同时配好防火墙放行该端口(UDP)。
访问控制 ACL
Tailscale 支持通过 tag + ACL 精细控制设备间的互访权限。例如只允许 PC 主动连接手机,反向不通:
{ "acls": [ { "action": "accept", "src": ["tag:pc"], "dst": ["tag:phone:5555"] } ]}常见问题
adb 找不到设备
先手动 connect 一次,之后才能列出设备:
adb connect my-phone:5555adb devices手机防误触模式(倒扣/口袋模式)导致屏幕锁定
双击音量键可解锁,或通过 ADB 命令强制解除:
adb -s my-phone:5555 shell \ 'wm dismiss-keyguard 2>/dev/null || true; input keyevent 82; input touchscreen swipe 540 2000 540 600 250'与其他 VPN/TUN 工具冲突
Tailscale 和其他基于 TUN 网卡的 VPN 工具(如企业 VPN)都会劫持流量并接管本地 DNS,两者同时运行可能相互干扰。
未验证的共存思路:关闭 Tailscale 的 Magic DNS,再手动配置路由表,使 Tailscale 设备地址段走 Tailscale 网卡,其余流量走另一个 VPN 网卡。谨慎操作,修改路由表前先备份。
中继服务器安装 Tailscale 后断网
尝试以下命令之一:
tailscale set --netfilter-mode=off# 或在 Tailscale 管理后台关闭 Magic DNS延伸:Exit Node 与 Subnet Router
Tailscale 还有两个相关功能:
- Exit Node:将指定设备设为出口节点,所有流量通过它出网(类似正向代理)。
- Subnet Router:将某设备所在网段单向暴露给其他 Tailscale 设备,让远端直接访问该子网内的资源。
这两个功能功能强大但权限敏感,启用前确认手机/设备所在网络的访问边界。