ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

告别手动抄端口:Android 13无线调试随机端口自动化连接方案

告别手动抄端口:Android 13无线调试随机端口自动化连接方案 不知道你有没有经历过这种场景想着趁午饭时间用真机跑一下自动化测试结果在抽屉里翻来翻去找不到一根能用的数据线或者数据线好不容易插上一碰手机接口就掉线日志打到一半直接断开。自从 Android 13 的无线调试功能成熟之后我基本告别了这种“插线-断连-换线”的循环。不过新问题随之而来无线调试的端口不是固定的今天是 36279明天可能是 41055连一次就跳一次尤其是重启之后端口几乎必变每次都得到“开发者选项-无线调试”里重新抄一遍地址。这篇文章要解决的就是这件事。我会把 Android 13 无线调试的原理、配对流程、随机端口的应对方案一次性讲透最后会给出一套 Windows / macOS / Linux 都能用的一键脚本让电脑自动发现设备端口并完成连接。你只需要保证手机和电脑在同一 Wi-Fi 下运行一条命令剩下全部自动完成。准备一台能开开发者选项的 Android 13 手机电脑上装好 platform-tools也就是 adb 工具就可以开始。1. 先说清楚Android 13 的无线调试为什么端口会随机变1.1 从 adb tcpip 到无线调试端口规则变了很多老 Android 开发者应该都还记得 Android 10 及更早时代的常规操作手机插上 USB 线执行一次adb tcpip 5555拔线然后用adb connect 手机IP:5555连接。这个办法简单直接端口也是固定 5555只要手机不重启就能一直连。也就是因为这个流程很多人在印象里已经默认“无线调试的端口就是 5555”。Android 11 开始事情变了。系统内置了真正的无线调试服务把“无线调试”从依赖 adb tcpip 变成系统级功能同时拆分成了两个端口一个是配对端口通常叫 paired 或者 pairing port另一个是连接端口也就是实际adb connect要用的端口。这两个端口都是随机生成的而且每次重新开关无线调试、重启手机、甚至重新配对后端口大概率都会变。Android 13 对这个机制进一步收紧。最直观的变化是开发者选项里的“无线调试”变成了独立开关点击后进入二级页面才能看到“IP 地址和端口”。如果你还拿着 Android 10 时代的记忆以为执行adb tcpip 5555就能固定端口大概率会碰壁。部分定制 ROM 可能还保留了这个隐藏指令但在原生 Android 13 上这条命令要么静默失败要么连接后秒断不能作为通用方案。1.2 随机端口不是 bug而是安全设计先别急着吐槽 Google 设计反人类。随机端口的底层逻辑很简单如果一个局域网里的设备端口固定在 5555那么同一 Wi-Fi 下其他任何设备都可以凭 IP 和固定端口猜测到 adb 服务进而尝试连接。过去很多朋友在公共网络、公司网络下开着调试其实是有被局域网设备扫描到甚至连上的风险的。无线调试启用后连接通道本身是经过 TLS 加密的并且要求先配对交换密钥端口随机化相当于给扫描这件事又加了一道障碍。即使有人扫描到开放端口也不知道该端口是不是 adb 服务也不知道当前的配对关系是否有效。所以从安全角度讲随机端口才是合理设计固定端口反而是历史包袱。理解了这一点你会发现思路不该是“想尽办法把端口固定下来”而是“让电脑自动找到当前端口”。方向对了方案自然就有了。2. 手把手无线调试的完整配对与连接流程2.1 手机端找到并开启无线调试不管什么品牌的 Android 13 手机第一步都是先打开开发者选项。路径一般为“设置 → 关于手机 → 版本号”在版本号上连续点击 7 次系统会提示“您已进入开发者模式”。部分厂商 UI 会把版本号入口藏得深一点比如在“系统管理”或“更多设置”下面建议直接去设置页搜索“版本号”。打开开发者选项后进入“开发者选项”页面找到“无线调试”开关。原生 Android 13 中它通常位于“调试”分组上面是“USB 调试”下面是“无线调试”。点击开关开启后页面下方会出现“IP 地址和端口”。第一次进入时能看到类似192.168.1.23:37129的字样这个其实是连接端口不是配对端口。注意一个常见现象无线调试开关如果处于灰色不可点说明手机当前没有连接 Wi-Fi。无线调试必须先保证手机连接 Wi-Fi。部分情况下手机连着 Wi-Fi 但开了节能策略也可能导致按钮置灰可以先把 Wi-Fi 断开重连一次或者关闭 Wi-Fi 再打开。vivo 等国产定制系统稍有不同。有的把无线调试放在“无线调试”独立页面有的把入口放在“更多设置”里名称可能叫“无线调试”也可能叫“通过 Wi-Fi 调试”。我个人的经验是别去跟菜单硬碰硬直接在系统设置里搜“无线调试”只要系统版本支持基本都能搜到。2.2 电脑端pair 和 connect 两条核心命令无线调试连接分两步先配对再连接。配对只需要做一次在同一个 Wi-Fi 下只要不关闭无线调试、不重启手机配对关系会保持连接则是建立实际调试会话可以断开后随时重连。先看配对。在手机无线调试页面点击“使用配对码配对设备”系统会显示一个六位配对码和一个带端口的地址端口一般是四位或五位数比如192.168.1.23:40123。在电脑上输入adb pair 192.168.1.23:40123此时命令行会提示Enter pairing code:输入手机上的六位配对码即可。配对成功会出现Successfully paired to 192.168.1.23:40123注意adb pair后面跟的端口跟无线调试主页面里显示的“IP 地址和端口”不是一回事。page 里显示的是连接端口配对页显示的是配对端口。很多人第一次就栽在这儿把界面上的连接端口填进了 pair 命令。配对完成后回到无线调试主页面确认上面显示的连接地址比如192.168.1.23:37129。然后执行adb connect 192.168.1.23:37129成功会返回connected to 192.168.1.23:37129再输入adb devices你会看到设备处于device状态说明调试会话已经建立。如果显示offline大概率是配对信息缺失或者 USB 调试未开启可以先把“USB 调试”打开再试如果显示unable to connect优先检查我上面说的端口是否用错了。2.3 多设备调试ADB 序列号怎么用无线调试连接后adb devices输出的第一列不再是 USB 那种序列号而是类似192.168.1.23:37129的地址。这个地址就是这台设备的连接标识。只有一台设备时直接adb shell就行。有多台设备同时连着后面所有命令都要带上-sadb -s 192.168.1.23:37129 shell adb -s 192.168.1.23:37129 install app.apk adb -s 192.168.1.24:40001 logcat如果不带-s命令行会报more than one device/emulator这是日常最容易踩的坑。我的习惯是把常用的设备 IP 写成环境变量比如export DEV192.168.1.23:37129然后所有命令都用adb -s $DEV shell省去重复记忆。3. 告别随机端口的一键方案自动发现端口并连接3.1 核心原理用 mDNS 发现 _adb-tls-connect 服务虽然端口是随机的但这不代表你需要手动去界面上看。Android 的无线调试启用了 mDNS 服务也就是多播 DNS会把自己的调试服务广播到局域网内。adb 客户端自带 mDNS 发现功能你可以直接通过adb mdns services查看当前局域网里有哪些可连接的 adb 设备。执行命令后输出可能长这样adb-tls-connect _adb-tls-connect._tcp 192.168.1.23:37129 adb-tls-pairing _adb-tls-pairing._tcp 192.168.1.23:40123第一行_adb-tls-connect对应的就是连接服务后面的192.168.1.23:37129就是当前要用的地址和端口。第二行_adb-tls-pairing对应配对服务。在没有配对的新设备上adb-tls-pairing服务会更早出现配对完成后adb-tls-connect才会稳定广播。所以思路很清晰不依赖手动读界面而是让脚本去调adb mdns services从中提取adb-tls-connect行的地址自动执行adb connect。这样无论端口怎么变脚本永远能找到正确的连接地址。mDNS 发现需要一点环境条件一是电脑和手机必须在同一局域网最好都在同一网段二是有部分路由器开启了“AP 隔离”“访客网络隔离”等功能会阻止设备间 mDNS 广播导致adb mdns services看不到设备。这一点在后面的常见问题部分会细说。3.2 Windows 一键脚本BAT 实现Windows 用户我推荐直接写一个.bat文件放进platform-tools目录或者在系统 PATH 里添加一个单独目录让wadb.bat可以在任意路径下执行。下面这个脚本会自动获取 mDNS 服务里的连接地址然后执行adb connectecho off setlocal enabledelayedexpansion set TARGET for /f tokens2 delims %%i in (adb mdns services 2^nul ^| findstr /c:_adb-tls-connect) do ( set TARGET%%i ) if %TARGET% ( echo [WARN] No ADB-TLS-CONNECT service found. echo [INFO] Make sure your phone is on the same Wi-Fi and wireless debugging is enabled. exit /b 1 ) echo [INFO] Found device: %TARGET% adb connect %TARGET% adb devices解释一下脚本逻辑adb mdns services输出的格式是adb-tls-connect _adb-tls-connect._tcp 192.168.1.23:37129每列以空格分隔。findstr过滤出包含_adb-tls-connect的行for /f tokens2取该行第二个空白分隔的字段注意我这里实际取的是第二个 token 还是第三个 token需要根据实际输出调整。常见的 adb mdns 输出是三列前两列是服务名称第三列才是地址那么这里用tokens3更稳妥。我平时使用的代码写的是tokens3大家照抄时注意一下。如果局域网里同时有多台设备上述脚本只取了最后一台发现到的设备。多设备场景下可以选择手动传入目标地址或者按需改造脚本循环 connect 每一台设备。少设备时这个简化脚本已经够用。3.3 Linux/macOS 一键脚本Bash 实现macOS 或 Linux 上写 Bash 脚本会更顺手。同样思路先取 mDNS 服务输出再解析地址。function wadb() { local target target$(adb mdns services 2/dev/null | grep _adb-tls-connect | awk {print $3} | head -n 1) if [ -z $target ]; then echo [WARN] No ADB-TLS-CONNECT service found. echo [INFO] Make sure your phone is on the same Wi-Fi and wireless debugging is enabled. return 1 fi echo [INFO] Found device: $target adb connect $target adb devices }把这个函数放进~/.bashrc或~/.zshrc重新加载或者打开新终端后直接输入wadb就能完成自动发现和连接。整个过程速度非常快基本两秒以内。输入source ~/.zshrc即可在当前终端生效。如果你的局域网里同名设备特别多可以改成给 awk 加一个过滤条件比如target$(adb mdns services 2/dev/null | grep 192.168.1 | grep _adb-tls-connect | awk {print $3})这种方式适合在固定网段内筛选避免把其他设备误连过来。3.4 如果系统恰好支持老式 tcpip 端口固定有一部分定制 ROM尤其是国内部分机型在 Android 13 上仍然保留了老式adb tcpip 5555指令功能。如果无线调试对你来说经常要重连也可以尝试这条老命令adb tcpip 5555执行成功后先断开再adb connect 手机IP:5555。如果连接成功说明该 ROM 支持旧式固定端口如果连接失败或者返回error: cannot connect to daemon说明系统已经不再支持这种方式不要再硬试。判断是否生效很简单adb shell getprop service.adb.tcp.port输出如果是5555说明 tcp 监听端口被成功设置为 5555如果输出为空说明当前没有启用 tcp 监听。需要明确的一点是这条命令在原生 Android 13 上已经不是标准方案能否使用取决于厂商是否保留兼容逻辑。能用算是意外之喜不能用也不必纠结回到脚本自动发现才是正道。4. 常见问题与排查技巧实录4.1 无线调试按钮是灰色的优先检查三项第一手机有没有连接 Wi-Fi没连 Wi-Fi 无线调试按钮必然是灰色第二是否进入了开发者选项有一些手机需要把“USB 调试”先打开无线调试相关入口才会激活第三手机系统版本是否低于 Android 11低于 Android 11 的系统没有内置无线调试只能靠adb tcpip 5555实现此时无论怎么找都找不到这个按钮。部分奇怪场景是手机连着 5G Wi-Fi但路由器开启了两台设备之间的隔离策略此时无线调试虽能打开但电脑就是发现不了。这种情况建议先切换 2.4G 或者关掉 AP 隔离试试。4.2 配对成功但 connect 不上这是我在评论区里看到频率最高的问题。配对已经出现Successfully paired但连接时返回unable to connect to xxx:12345。先确认你用的是无线调试主界面的“IP 地址和端口”不是配对页面上的地址。这两个端口长得差不多特别容易看混。其次确认手机和电脑是否真的在同一网段比如手机是192.168.1.x电脑却是192.168.0.x路由器下挂多级网络时经常出这种问题。还可以试下关闭电脑防火墙。Windows 防火墙偶尔会拦截 adb 与手机之间的入站连接尤其当你换了一个新的随机端口时Windows 会提示是否允许 adb 通信如果当时误点了取消后续连接就会被静默拦截。最后一个冷门排查点部分 Android 13 设备在连接无线调试时要求 USB 调试处于开启状态。也就是说你要保持“USB 调试”开关也开着只是不需要实际插线。如果 USB 调试被关了连上了也会很快变成 offline。4.3 为什么重启后要重新配对Android 11 以后的无线调试配对信息与系统生成的密钥对绑定。手机重启后无线调试服务会重置配对关系部分设备甚至连连接端口都会变导致你之前配好的设备从列表里消失。这是系统安全策略的一部分防止攻击者拿到一次配对信息后长期驻留。解决思路也不是去改策略而是形成“重启后重新跑一遍配对”的习惯。好在整个配对过程只要十几秒手机端进入无线调试页面生成配对码电脑端执行adb pair然后执行wadb脚本自动连接。脚本的存在价值在这里体现得最明显你不需要反复去记端口每次重新配对后脚本会自动发现新端口。4.4 vivo 等定制系统找不到无线调试入口vivo 的部分机型包括网上常被提到的 y52 之类入门机型系统版本不同设置菜单差异很大。如果手机系统是基于 Android 11 或更高版本理论上都有无线调试功能但 vivo 可能把它藏在“更多设置”而不是“开发者选项”下。找不到时直接在设置页搜索“无线调试”一般都能定位到。如果搜不到再检查是不是系统版本太低。部分低版本系统并不带无线调试只能先通过 USB 线执行adb tcpip 5555开启无线 adb 功能。注意这类设备连接时建议设置里同时打开“USB 调试”和“USB 安装”否则部分厂商会拦截 adb 指令。4.5 高频命令速查表场景命令 / 操作查看可发现的无线调试设备adb mdns services配对设备adb pair 手机IP:配对端口连接设备adb connect 手机IP:连接端口查看已连接设备adb devices指定设备执行 shelladb -s 手机IP:连接端口 shell指定设备安装应用adb -s 手机IP:连接端口 install app.apk旧式固定端口命令adb tcpip 5555然后adb connect 手机IP:5555检查当前 tcp 端口adb shell getprop service.adb.tcp.port断开无线调试连接adb disconnect如果你发现自己反复需要查某一条命令建议把上面表格写进本地笔记或者直接作为注释写进一键脚本里省得每次翻文章。5. 进阶把一键连接脚本放进你的日常开发流程5.1 Windows 全局命令、macOS/.zshrc 别名Windows 上如果你不想每次进到脚本目录才运行可以新建一个wadb.bat放置到任意已经加入 PATH 的目录里或者直接把 platform-tools 所在目录和脚本所在目录一并加入 PATH。这样在任何终端窗口输入wadb就能直接执行。macOS 和 Linux 用户最简单的方式是把前面写好的 Bash 函数放进~/.zshrc或~/.bashrc添加一行 aliasalias wadbwadb_function如果你不想每次都加载一遍函数也可以保存成独立的wadb.sh文件加入可执行权限后放到/usr/local/bin/然后在任意目录直接敲wadb。顺手安利一个我自己的偏好脚本里除了自动 connect还额外加了一句adb devices目的很简单就是让执行结果一目了然。看到device状态调试会话才算真正建立很多问题其实在 connect 成功但 devices 显示 offline 的状态下就已经暴露了。5.2 配 adb reverse 直接调试真机上的 Web 页面无线调试连上之后我经常配合adb reverse来做真机上的 Web 页面调试。adb reverse 的作用是把手机端口映射到电脑端口举个例子adb -s 192.168.1.23:37129 reverse tcp:8080 tcp:8080这样手机上访问http://localhost:8080时流量会被转发到电脑的 8080 端口。对于本地开发 Web 项目、小程序调试、H5 页面预览这类场景非常方便而且它走的是 adb 通道不受手机和电脑是否同一 Wi-Fi 的影响只要 adb 连接保持反向转发就一直有效。需要注意一点每次无线调试断开重连后adb reverse 的映射关系会丢失需要重新执行。建议把要执行的 reverse 命令也写进一键脚本里比如adb -s $target reverse tcp:8080 tcp:8080这样每次执行wadb时不仅自动连接还会自动帮你把常用端口映射配置好真正做到“一条命令进入开发状态”。最后再分享一个小技巧我自己更倾向于在脚本里输出 mDNS 服务的原始列表而不只是连接地址。因为当某个设备连接失败时你往往需要确认它到底有没有出现在 mDNS 广播里这能快速判断问题是出在“设备没广播”还是“电脑连接失败”上。把这个信息打印出来虽然平时看着啰嗦但排障时会省很多时间。无线调试这套东西只要理解端口随机是安全设计、脚本自动发现才是正解后面用起来就会顺畅很多。希望这篇内容能帮你彻底告别手动抄随机端口的日子。
返回列表