adb devices显示unauthorized或offline的解决方法(撤销USB调试授权、adbkey与5037端口占用)

真机调试连不上,adb devices出来三种结果最烦人:设备名后面跟unauthorized、跟offline,或者List of devices attached下面一个设备都没有。这三种不是一回事,处理方式也不一样,混着查会白折腾很久。

unauthorized是手机没认可这台电脑;offline是adbd已经起来了,但adb server跟它握手没成功;空列表则是驱动或者物理连接的问题。


先做一遍标准动作

手机端进开发者选项,找到"撤销USB调试授权",点一下。这个操作会清掉手机上保存过的所有电脑RSA公钥,之后重新插线,授权弹窗才会再出来一次。不拔线直接点是不弹的,顺序是撤销、拔线、再插。

插上之后从屏幕顶部拉下状态栏,USB用途选"传输文件"(MTP),别停在"仅充电"。这一步跳过的话,部分机型根本不弹授权框。弹出来之后勾上"一律允许使用这台计算机进行调试",再确定。

然后回到电脑:

adb kill-server
adb start-server
adb devices

大部分unauthorized到这一步就变成device了。


电脑上的adbkey也可以直接删

授权信息在电脑上是一公一私两个文件。Windows在 %USERPROFILE%\.android\ 下,Linux和macOS在 ~/.android/ 下,名字叫adbkey和adbkey.pub。两个一起删掉,下次adb start-server会生成一对新的,手机上会重新弹授权:

del %USERPROFILE%\.android\adbkey %USERPROFILE%\.android\adbkey.pub
adb kill-server
adb start-server

碰到过一种情况:同一台机器上装了Android Studio又装了独立的platform-tools,两份adb版本不一致,一个生成密钥、一个去用,互相覆盖,删干净重来反而最快。


版本不一致时server会自杀

如果adb devices的输出前面跟着这么一句:

adb server version (41) doesn't match this client (36); killing...

说明当前执行的adb跟后台已经在跑的adb server不是同一份。查一下系统里到底有几个:

where adb

Windows上典型输出会有两三条,一条来自Android SDK的platform-tools,一条来自某个手机助手软件自带的目录。把PATH里正确的那份排到最前面,或者干脆每次用绝对路径执行。platform-tools 33.0.3、34.0.5、35.0.1,这几个版本之间协议号就变过,混用必炸。实测统一成一份之后,handshake failed再没出现过。


5037端口被别人占了

adb server固定监听本机的5037端口。被占的话现象是命令卡住,或者干脆连不上设备:

netstat -ano | findstr 5037
tasklist /fi "PID eq 1234"

找出PID之后taskkill /PID 1234 /F结束掉。常见的占用方是各种手机助手、豌豆荚一类的工具,还有模拟器自带的adb。这类软件装一个就够呛,装两个基本没跑。


Windows上device变offline,多半是驱动

设备管理器里看一眼,如果"Android ADB Interface"带黄色叹号,或者设备被识别成"便携设备"、未知设备,那就是驱动没装对。SDK Manager里勾上Google USB Driver,装完手动更新驱动,指向sdk\extras\google\usb_driver目录,强制选 "Android ADB Interface"。国内不少厂商的机型不认Google这个驱动,去厂商官网下它自己的驱动包通常更省事。

另外换根线试试。有些线只有电源线没有数据线,插上去能充电,adb死活认不出来,这种事见过不是一次两次了。


Linux下offline是udev规则的事

Ubuntu一类发行版上,普通用户没有USB设备的访问权限,adb devices会一直显示offline或者no permissions。加一条规则:

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo service udev restart

18d1是Google的vendor id,别的厂商要换成自己的:华为12d1、小米2717、三星04e8。改完重新插拔,再adb kill-server一次。


嫌线麻烦就走无线调试

Android 11之后系统自带无线调试。开发者选项里打开,进无线调试页面,用配对码配对:

adb pair 192.168.1.20:37123
adb connect 192.168.1.20:5555

配对端口每次都是随机生成的,连接端口相对固定。断掉用adb disconnect 192.168.1.20:5555。无线调试的好处是彻底绕开USB驱动和线材,缺点是慢一截,装大一点的apk能明显感觉出来,日常调试够用。

涉及版本platform-tools 33.0.3、34.0.5、35.0.1,adb 1.0.40、1.0.41,Android 11、12、13、14,数据截至2026年9月。