ARTICLE DETAIL

资讯详情

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

adb远程连接完全指南:从USB到无线,原理、方案与实战

adb远程连接完全指南:从USB到无线,原理、方案与实战 写这篇东西的起因很简单有一次我坐在办公室工位要调的设备在另一个楼层的测试间。手机一直插着充电线亮着屏幕但USB线就是拉不过去拿个日志都得上下跑楼梯。那会儿我特别希望adb能像连远程服务器一样连手机后来真去查了才发现adb本身就支持网络连接而且操作比我想象中简单得多。这篇文章就把Android调试里远程连接adb这件事儿从头到尾捋一遍。你会看到原理、三种实用连接方案、远程能干什么、常见报错怎么排查以及电视盒子、模拟器这些特殊设备怎么连。不管你是Android开发、测试、嵌入式调试的工程师还是平时爱折腾手机的工具党照着操作一遍基本都能搞定。1. 先搞明白远程连接adb到底是在连什么1.1 adb的三层结构客户端、服务端、守护进程adb全称Android Debug Bridge翻译过来就是“安卓调试桥”。它不是一个单独的程序而是三个角色协作的一套体系。adb client跑在你电脑上的命令端。你敲的adb devices、adb install、adb shell都是它在发起请求。adb server也是跑在你电脑上的后台进程负责管理电脑和所有设备之间的连接。它常驻在你电脑上监听本地的5037端口。adbd全称adb daemon跑在设备端。手机、平板、电视盒子、开发板里都有它负责接收电脑发来的指令并执行。你可以把server理解成快递中转站adbd就是小区驿站client是填单子的人。中转站和驿站之间得有一条稳定通道快递才能来回送。远程连接adb本质就是让“中转站”和“驿站”之间从一根USB线换成网络传输。理解这个结构最大的好处是排错。后面遇到问题无非三种可能client找不到serverserver找不到设备或者设备找到了但没授权。定位思路清晰了所有报错都好解。1.2 远程连接的本质让adbd监听网络端口默认情况下手机通过USB线和电脑相连adbd跟server之间的通信走USB通道。而远程连接要做的是让adbd在设备上额外开一个网络监听端口这个端口默认是5555。监听一旦开启电脑端的server就能通过网络去连这个端口了。这里有个容易忽略的点USB通道和网络通道是并行的。你执行adb tcpip 5555之后adbd会监听5555端口但USB通道并没有被关闭。反过来也一样无线连接成功后拔不拔USB线都不影响网络通道工作。很多新手以为“无线连上就得拔线”其实没这个必要只不过不占USB口确实方便。本地这边还要留意adb server跑在电脑的5037端口上。想确认server有没有起来Windows上执行netstat -ano | findstr 5037macOS或Linux执行netstat -ano | grep 5037能看到adb进程在监听就说明server活着。真正容易被防火墙拦的其实是设备端5555端口对应的流量所以后面远程连不上时先排查网络和防火墙。1.3 准备工作把工具链条理顺远程adb听着高级前置条件很常规。第一步是确保电脑上有adb工具。装过Android Studio的SDK目录下的platform-tools里自带adbmacOS一般在~/Library/Android/sdk/platform-toolsWindows在%LOCALAPPDATA%\Android\Sdk\platform-tools。不想装完整IDE的单独下载platform-tools压缩包解压后把目录加进PATH也行。第二步尽量用新版本。旧版adb不是不能远程连而是Android 11以后新增了无线配对功能要用adb pair命令。我见过有人用两年前的platform-tools死活连不上新手机更新一下工具立刻就好了。第三步跑一下adb version和adb devices验证环境。这里提醒一句第一次执行adb命令时系统会启动adb server如果防火墙弹窗问“是否允许adb访问网络”一定要点允许。不点的话后面无线连接大概率失败而且报错很迷惑你会以为是IP写错了。2. 三种最常用的无线连接方案2.1 方案A先USB、再无线老设备也通用这个方法适用面最广Android 4.0到Android 10的老设备用它Android 11以上新手机也可以临时用。核心思路是先用USB让设备进入网络监听模式然后拔线走网络。完整步骤是这样的手机打开“开发者选项”里的“USB调试”用USB线连上电脑。确认设备在线adb devices看到device状态就行。让adbd开启网络监听adb tcpip 5555。执行完会回显restarting in TCP mode port: 5555。拔掉USB线查手机的IP地址。最简单的方法手机连上Wi-Fi后去“设置-关于手机-状态信息”里看IP也可以用命令查adb shell ip addr show wlan0找到inet后面的地址比如192.168.1.100。电脑执行连接adb connect 192.168.1.100:5555。再次adb devices看到192.168.1.100:5555 device就成功了。这套流程里有几个坑。第一手机和电脑必须在同一个局域网不同网段的话连不上。第二路由器如果开了“AP隔离”手机和电脑之间无法互通也会失败。第三某些国产ROM会在息屏后主动断开Wi-Fi省电导致刚连上就掉线解决办法是连着充电器或者去Wi-Fi设置里关闭“休眠时保持连接”的省电策略。还有个小经验如果你已经执行过adb tcpip 5555之后设备重启了想再无线连接不需要再插USB直接adb connect 192.168.1.100:5555通常就能连上。因为有些固件把监听端口保住了。2.2 方案BAndroid 11以上原生无线调试全程不插线Android 11及以上系统Google加入了原生无线调试功能不需要USB线用配对码就能把电脑和设备绑在一起。这个方案是我现在用得最多的确实方便。操作路径手机“设置-开发者选项-无线调试”点进去会看到当前设备的IP地址和端口还有“使用配对码配对设备”的按钮。流程是这样的手机无线调试页面点“使用配对码配对设备”屏幕上会显示6位配对码和配对端口比如192.168.1.100:39685。电脑上执行配对命令adb pair 192.168.1.100:39685。提示输入配对码输入手机上那6位数字回车。看到Successfully paired to ...就成了。回到无线调试主页面记下“IP地址和端口”那一栏显示的连接端口这个端口和配对端口通常不一样。执行adb connect 192.168.1.100:连接端口。注意这里的端口必须是主页面显示的那个而不是配对端口。adb devices确认状态。这个方案最大的优势是第一次配对之后只要手机和电脑还在同一个网络里之后基本都能直接adb connect不用再输配对码。但如果手机执行了“撤销USB调试授权”或者你删除了电脑上的adb key就需要重新配对。有个细节容易被坑无线调试页面上显示的连接端口不固定有时会变。你发现adb connect用的旧端口连不上了就去页面看一眼是不是端口换了重新连接新端口即可。2.3 方案C设备已经开放5555端口直接连有些设备本身就一直开着网络调试端口最典型的是智能电视、电视盒子、开发板以及部分模拟器。它们的adbd默认就在监听5555端口省去了tcpip这一步直接adb connect 192.168.1.100:5555就能连上。这种场景要注意IP稳定问题。电视盒子或者开发板如果没有设置静态IP路由器重启后DHCP分配的IP可能会变下次就连不上了。建议在路由器后台给这些设备做DHCP静态绑定或者直接在设备网络设置里配固定IP。我一般绑定到固定IP这样写自动化脚本时不用反复改地址。2.4 三种方案横向对比方案适用系统是否需要USB适合场景注意点先USB再无线Android 4.0及以上所有系统首次需要老手机、定制ROM、临时调试同一局域网设备别休眠掉线原生无线调试Android 11及以上完全不需要新手机日常开发调试配对端口和连接端口不同注意区分直接connect电视、盒子、开发板、模拟器不需要固定设备、长时间调试建议固定IP便于脚本管理如果你经常要连接固定的几台设备我建议把连接命令写成一个脚本比如保存为connect.sh#!/bin/bash for DEVICE in 192.168.1.100 192.168.1.101 192.168.1.102; do adb connect $DEVICE:5555 done adb devices给脚本加上可执行权限chmod x connect.sh以后连设备一条命令搞定。3. 远程连接成功后能干哪些事3.1 把adb当成远程键盘和鼠标远程连上之后如果你手头没有实体键鼠接到设备上可以靠adb来模拟操作。这些命令在远程调试里非常实用。模拟按键adb shell input keyevent 3HOME键、adb shell input keyevent 4返回键、adb shell input keyevent 26电源键、adb shell input keyevent 66回车。输入文本adb shell input text hello。注意这条命令不支持中文需要输入中文的话可以装支持ADB输入法协议的中文输入法应用把输入法切到它再通过adb输入。截屏adb exec-out screencap -p screen.png。exec-out和shell screencap的区别在于exec-out直接把二进制流输出到本地文件避免Windows或者shell环境下的转义问题所以我更推荐这种写法。录屏adb shell screenrecord /sdcard/demo.mp4在手机端录屏最后adb pull /sdcard/demo.mp4拉回电脑。比如你要远程演示一个App的操作流程完全可以用adb执行截屏和录屏把录好的视频发给同事整个过程不用碰设备。3.2 远程抓取logcat日志并落盘logcat是Android开发排查问题最常用的日志系统远程连接下操作方式和本地USB连接没有任何区别。常用命令我给你整理一下实时输出带时间的日志adb logcat -v time只看错误级别及以上adb logcat *:E只看某个TAGadb logcat MyApp:* *:S星号冒号S表示屏蔽其他所有TAG按进程过滤先adb shell pidof 包名拿到PID再adb logcat --pid12345抓取并保存到文件adb logcat -v threadtime app.logCtrlC停止只抓当前缓冲区然后退出adb logcat -d -v time current.log这个适合给日志打快照清空日志adb logcat -c抓崩溃缓冲区adb logcat -b crash如果App崩溃了-b crash这个buffer里能看到比较完整的异常栈。很多线上问题定位靠的就是远程连上设备之后抓一份crash日志再配合adb bugreport导出的系统信息一起分析。3.3 远程安装应用、清缓存、导出问题现场远程调试时装包和清数据是高频操作。安装APKadb install -r -t app.apk-r是覆盖安装-t允许安装测试包。强制停掉应用adb shell am force-stop 包名清除应用数据adb shell pm clear 包名拉取应用私有目录文件如果应用是debuggable的可以用adb shell run-as 包名 ls files这样的方式进到私有目录也可以用adb pull拉取外部存储里的文件。现在很多应用出于安全考虑会把文件写到/sdcard/Android/data/包名/这类目录下调试时经常需要远程拉取这些文件。我的习惯是先adb shell ls /sdcard/Android/data/包名/确认路径再adb pull出来。拉取大量小文件时建议先打包再拉比如adb shell tar -czf /sdcard/logs.tar.gz /sdcard/Android/data/包名/然后pull打包文件速度和稳定性都好得多。3.4 用scrcpy把远程设备屏幕搬过来如果只是命令行操作日志和按键其实对很多人来说还不够直观。更爽的方案是配合scrcpy把设备的屏幕实时投射到电脑上还能用鼠标键盘直接操作手机体验和本地操作几乎没区别。scrcpy是开源项目底层就是通过adb传输视频流和控制指令所以在远程adb连接成功之后直接用就行。连接命令scrcpy --tcpip192.168.1.100:5555如果你已经先adb connect过了直接执行scrcpy它会自动识别当前设备。远程场景下画面清晰度和帧率可以适当调整比如限制一下分辨率或帧率scrcpy --max-size 1024 --max-fps 15这样在无线网络环境差一点的时候操作延迟能小不少。这个组合是我远程调试的主力方案远程开会演示、帮同事看现场问题、给测试机录操作视频全靠它。4. 多设备和跨机器调试的实战复盘4.1 多台设备同时在线怎么精确指挥一个adb server可以同时连接很多台设备但默认adb shell这种命令只会作用于列表里的第一台所以多设备场景必须用-s参数指定设备。先看所有设备adb devices -l每台设备会显示序列号、型号等比不带-l的信息更全方便区分。指定某台设备执行命令adb -s 192.168.1.100:5555 shell getprop ro.product.model adb -s 192.168.1.100:5555 install app.apk adb -s 192.168.1.100:5555 logcat -c批量给多台设备装同一个包可以写个循环for DEVICE in $(adb devices | awk NR1 $2device{print $1}); do adb -s $DEVICE install -r app.apk done这套操作在多机型回归测试时特别有用比如同时跑3台不同厂商的机器统一装包、统一触发脚本、统一抓日志效率比一台一台插USB高太多。4.2 设备接在远程服务器上本机怎么连还有一种常见场景设备USB线接的不是你面前的电脑而是实验室的服务器、公司的工控机你坐在自己工位上想操作它。最简单的办法是SSH登录那台服务器然后在服务器的终端里执行adb命令。如果你平时就用VSCode Remote-SSH连远程开发机直接在远程终端里跑adb devices、adb shell、adb logcat跟在本地操作一模一样这也是我推荐优先用的方式。如果想在自己电脑上直接操作远程接的设备可以用SSH端口转发把远程机器的5555端口映射到本地。假设远程服务器IP是10.0.0.5设备已经连在那台服务器上并开启了5555端口本机执行ssh -L 15555:localhost:5555 user10.0.0.5然后把本机adb连接到本地映射出来的端口上adb connect 127.0.0.1:15555注意这里用的不是默认的5555端口而是自己指定的15555端口这样能避免和本机其他adb连接冲突。这个方案对网络环境有要求SSH通道本身有认证加密比直接暴露adb端口安全得多。4.3 局域网内设备状态巡检小脚本几台设备长期放在实验室里经常要确认它们还在线、adb连接还通不通。手写脚本巡检是个好办法下面这段脚本会逐个尝试连接并显示结果#!/bin/bash DEVICES192.168.1.101 192.168.1.102 192.168.1.103 for IP in $DEVICES; do if ping -c 1 -W 1 $IP /dev/null 21; then adb connect $IP:5555 /dev/null 21 STATUS$(adb -s $IP:5555 get-state 2/dev/null) echo $IP - $STATUS else echo $IP - offline fi done把这个脚本放到计划任务里每天早上自动跑一遍输出结果发到邮箱或群里设备掉线第一时间就能知道。我做长时间压力测试时就是靠这个脚本盯着几台设备的状态省了不少腿脚。5. adb远程连接常见问题排查实录5.1 adb unauthorized授权弹窗消失术adb devices看到设备序列号后面跟着unauthorized说明设备端没有放行这台电脑的调试请求。原理是adb连接时电脑会把自己的RSA公钥发给设备设备上会弹一个“允许USB调试吗”的对话框必须人工点击允许。远程无线连接时同样需要授权。解决办法按顺序来把手机拿起来看屏幕上有没有授权弹窗勾选“始终允许来自此计算机的调试”点确定。没有弹窗的话去“开发者选项”里找“撤销USB调试授权”撤销之后重新连接再在设备上点允许。还不行电脑上执行adb kill-server再adb start-server重启server再连。最后手段删除电脑上用户目录里的~/.android/adbkey和adbkey.pub重启adb重新生成密钥配对。这会让你所有设备都变成未授权状态需要逐台重新授权所以当最后手段用。这个报错在换电脑、换系统、清理过用户目录之后特别常见不要慌按顺序来基本都能解决。5.2 连接成功却一直offline设备出现在列表里但状态是offline这种往往比unauthorized更麻烦一点因为设备确实“声称”它在线但adb会话没有建立成功。常见原因有三个adb版本太旧手机系统太新双方协议不兼容。这个最好解决更新platform-tools。Windows下驱动异常。设备管理器里看有没有带问号的ADB设备重装对应厂商USB驱动。无线网络不稳定信号弱导致连接反复中断。靠近路由器试试或者用上面提到的scrcpy降低帧率的方式减少带宽占用。处理流程通常是这样adb kill-server重新插拔USB线或者重新adb connect再不行更新platform-tools最后才考虑重启设备。5.3 连接超时、拒绝连接从网络层排查adb connect报cannot connect to 192.168.1.100:5555: Connection refused或者超时是另一类问题。这类问题的根源在网络上按下面顺序排查先ping设备ping 192.168.1.100不通说明IP不对或者不在同一网段先去确认IP和网段。确认设备端有没有开5555监听。如果是用adb tcpip 5555开的但中间拔线断连过有时端口会失效重新插线执行一次adb tcpip 5555。检查端口是否可访问。Windows可以用telnet 192.168.1.100 5555测试macOS/Linux用nc -vz 192.168.1.100 5555。检查本机防火墙。如果前面几步都正常但就是连不上去防火墙里给adb程序或者5555端口放行。我见过一个比较隐蔽的情况路由器开启了AP隔离设备能上外网但设备之间不能互通导致怎么ping都不通。这种只能去路由器后台关掉AP隔离或者在设备同一交换机下再试试。5.4 设备重启后连不上自动重连怎么搞设备一旦重启原来建立的adb无线连接会断开。Android 11以上的手机如果无线调试开关还开着通常重启后还是可以重新adb connect但连接端口可能变了要重新看页面。更麻烦的是执行过adb tcpip 5555的老设备重启之后这个设置可能失效需要重新插USB设置一遍。如果设备有root权限可以修改service.adb.tcp.port5555这一属性让adbd开机就监听5555端口一劳永逸。不过正常开发场景里我一般不去动系统属性用电量更大的做法是写个重连脚本while true; do if ! adb devices | grep -q 192.168.1.100:5555.*device; then adb connect 192.168.1.100:5555 /dev/null 21 fi sleep 30 done这个脚本挂在后台设备一重启、网络一恢复30秒内就能自动重新连上。做长时间跑测非常省心。5.5 常见问题速查表现象可能原因排查顺序处理办法unauthorized设备未授权电脑看手机弹窗撤销授权重试勾选始终允许重启adb最后删adbkeyoffline版本不匹配、驱动、网络差确认版本重连设备更新platform-tools重装驱动重跑adb connectconnection refused设备没开网络监听确认adb tcpip 5555是否执行成功重新插USB开tcpip或确认设备原生无线调试已开启超时网络不通、不同网段、AP隔离ping、telnet、检查防火墙改IP、关AP隔离、防火墙放行5555重启后掉线监听设置丢失或端口变化检查设备当前状态插USB重开tcpip或写重连脚本6. 模拟器、电视盒子与硬件调试场景6.1 模拟器调试夜神、雷电、MuMu怎么连Android模拟器本质是个运行在电脑上的虚拟机远程连接adb其实走的是loopback地址也就是127.0.0.1。不同的模拟器监听的端口不太一样比如夜神模拟器常见端口是62001雷电模拟器通常监听5555旧版MuMu监听7555。但这些端口不代表永远固定可能随版本变化。最靠谱的办法其实是启动模拟器然后执行adb devices看模拟器在列表里显示的序列号是什么。它一般会以127.0.0.1:xxxx的形式出现那个就是它的adb端口。比如你在列表里看到127.0.0.1:62001 device说明夜神的adb端口是62001下次直接adb connect 127.0.0.1:62001就能连上。模拟器远程连接的意义在于开发机、CI打包机可能不在同一个物理位置或者你习惯用VSCode远程连到开发服务器服务器上跑着模拟器你本地通过SSH过去操作服务器上的adb再连127.0.0.1的模拟器端口整套链路就串起来了。6.2 电视盒子和开发板怎么远程连很多电视、盒子本身不带显示屏或者挂在墙上插USB特别不方便。好在多数品牌的智能电视和电视盒子在开发者选项里都有ADB调试开关默认走5555端口。通用开启路径大概是“设置-关于-连续点击版本号”进入开发者模式然后到“开发者选项”里打开“ADB调试”或“USB调试”。不同厂商叫法不一样有的直接叫“网络调试”有的叫“ADB远程调试”。打开以后再确认设备的IP电脑上直接adb connect 电视IP:5555。连上以后能干的事很多远程安装应用、adb shell am start拉起指定页面、抓logcat、录屏。经常有人问“可不可以用adb关掉电视里不用的预装应用”答案是可以通过adb shell pm disable-user --user 0 包名来停用恢复时用pm enable 包名。但我要认真提醒一句这个操作只建议在开发测试机上做停用关键系统组件可能导致部分功能异常甚至系统异常别拿主力设备瞎试。开发板跟电视盒子类似但灵活度更高。很多开发板固件默认开了网络adb或者可以方便地配置开机自启adb监听非常适合作为长期测试设备放在实验室里。6.3 硬件调试场景里adb和串口怎么配合在嵌入式或硬件相关的调试里adb和串口UART不是竞争关系而是分工。串口往往能看到bootloader阶段、内核早期的启动日志这些日志在Android系统还没起来之前就有输出对排查启动问题、驱动初始化问题非常关键。而adb要等Android系统起来之后才能用适合看系统服务、上层应用、Framework日志。两块工具覆盖的阶段不重叠配合起来正好把整个启动流程看全。远程adb在多硬件场景还有一个额外好处设备装在测试台架、温箱、老化柜里人不用蹲在设备旁边。比如设备在高温箱里跑老化你坐在工位上通过adb远程抓一个小时的crash日志比守在设备旁边舒服多了。配合adb forward端口转发还能把设备上的TCP端口映射到电脑上做网络联调这个以后可以单独写一篇。6.4 怎么选按场景挑方案使用场景推荐方案理由日常开发机连新手机Android 11原生无线调试不用插线UE最好配对一次之后基本无感老手机、定制ROMUSB先执行tcpip再连兼容所有系统版本电视、盒子、开发板直接connect固定IP设备长期在线配静态IP后非常稳定多台设备统一调试adb connect批量连接 -s指定一台电脑管理全部设备设备接在远程服务器上SSH远程执行adb或SSH端口转发安全可行不暴露调试端口先用脚趾头想清楚自己的场景再选方案能少走很多弯路。比如你非要让Android 10的老手机走原生无线调试那怎么配都不可能成功因为系统不支持反过来Android 13的新手机非要用USB加tcpip的方式也不是不行只是没必要。最后说一点个人经验我最常用的组合就是原生无线调试加scrcpy在同一个局域网里几乎感受不到延迟写代码调试、看日志、操作设备全程不用碰手机。踩过最大的坑是电脑上的platform-tools版本过旧新手机怎么都配对不上更新之后一分钟搞定。另外远程adb很方便但它也是一把能直接操作你设备的钥匙别随手把adb端口暴露到不信任的网络里不调试的时候就把无线调试关掉。这串东西用好了能帮你省下大量跑上跑下的时间多出来的精力干点啥不好呢。
返回列表