十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Android Studio 找不到手机?adb devices 全链路排查

Android Studio 找不到手机?adb devices 全链路排查 周五下午快下班的时候同事把一台刚拆封的手机插到我机器上Android Studio 右上角那个设备下拉框干干净净只显示 No Devices。他前前后后换了三根数据线、重装过两次驱动甚至开始怀疑手机是坏的。我接手之后花了大概六分钟就搞定了根因是开发者选项里一个默认关闭的开关。这件事让我觉得有必要把Android Studio 找不到连接的手机这个看似最基础的问题认真写一遍——它几乎是每个做 Android 开发的人都会撞上的墙而它的排查面横跨硬件线材、系统驱动、adb 守护进程、厂商 ROM 定制和 IDE 自身配置这五层。任何一层掉链子对外表现都是同一句话设备列表为空。这篇内容适合刚装完 Android Studio 准备跑第一个 HelloWorld 的新手也适合像我这样用了好几年、但每次换设备仍要重新摸索一遍的人。1. 先别急着点 Android Studio用 adb devices 把问题切成两半我见过太多人在遇到设备不显示时第一反应是重启 IDE、重装 Android Studio、清理缓存折腾一两个小时结果连问题的边界都没摸到。Android Studio 本质上只是 adbAndroid Debug BridgeAndroid 调试桥的一个调用方设备列表是从 adb 那里问来的。所以判断问题在电脑到手机这一段还是adb 到 IDE这一段只需要在终端敲一条命令。1.1 adb devices 是唯一可信的判据打开终端把手机插上执行adb devices。这条命令会返回一份设备清单格式是设备序列号加状态。如果这里能看到你的设备且状态是device那说明整条底层链路是通的问题百分百出在 Android Studio 那边接下来只需要处理 IDE 配置如果这里是空的或者状态异常那 Android Studio 里怎么点都没用得往底层查。这个先切分再定位的动作能省掉大量无效操作也是我这么多年排查硬件类问题最依赖的一个习惯。1.2 五种状态分别意味着什么adb 的输出看起来很单调但每一种状态都精确指向一类原因。把它们区分清楚排查效率会高一个数量级。adb devices 输出含义最常见的根因xxxxxxxx device完全正常无直接去 IDE 里选设备xxxxxxxx unauthorized手机没授权这台电脑RSA 授权弹窗被拒、被不再询问记住后撤销失效xxxxxxxx offline枚举到了但通信失败adb 版本与系统不匹配、线材接触不良、adb server 卡死xxxxxxxx no permissions权限不足Linux 下 udev 规则缺失或 macOS/Linux 下接口被其他进程占用列表完全为空设备根本没被枚举USB 调试开关、驱动、线材、端口占用adb: command not found命令本身不可用platform-tools 没装或没进 PATH我特别想强调unauthorized这个状态。很多人的设备其实已经连上了只是停在授权这一步而 Android Studio 在旧版本里对这种状态的表现就是列表为空不给你任何提示非常容易被误判成没连上。1.3 三条命令建立排查基线我通常会用下面这组命令一次性把信息拿全而不是反复插拔试运气adb kill-server # 先杀掉可能卡死的旧服务 adb start-server # 重新拉起观察启动日志有没有报错 adb devices -l # -l 会额外输出 product、model、device 等详细信息adb devices -l的额外字段在有多台设备时特别有用它能告诉你 adb 到底认出了哪一台而不是只给一个序列号。如果adb start-server本身就在刷错误比如提示端口被占用那问题根本不在手机先去处理电脑上的冲突后面章节会讲到。提示执行 adb 相关命令前确保终端里的 adb 和 Android Studio 用的 adb 是同一个可执行文件否则你看到的结果和 IDE 看到的结果可能完全不一样这一点在装了多个 SDK 的机器上非常普遍。2. 手机这一侧三个开关层层递进厂商还额外藏了一手把链路切分清楚之后如果 adb 层面就看不到设备那就往下走。手机端是所有排查里最容易被忽略、但命中率最高的一层因为默认状态下手机的调试能力是全部关闭的需要你逐层打开。2.1 开发者选项本身要先解锁Android 从 4.2 开始就把开发者选项这个菜单藏起来了。打开方式是进设置 → 关于手机连续点击版本号七次看到您已处于开发者模式的提示才算成功。有些厂商 ROM 点的是版本信息里的某个具体字段比如软件版本号或者内部版本号位置略有差异。这一步没做的话后面所有 USB 调试相关的开关你根本找不到这也是新手最常卡的第一关。2.2 USB 调试打开之后还有个连接模式要确认开发者选项里那个USB 调试开关必须打开这一点大家都知道。但很多人不知道的是插上数据线后手机通知栏里还有一个 USB 用途的选择通常在仅充电传输文件传输照片MIDI之间切换。部分 ROM 在仅充电模式下会直接关闭数据通道adb 自然就看不到设备。我的习惯是插上线之后立刻下拉通知栏确认一下如果显示的是正在通过 USB 为此设备充电就手动切成传输文件。这里有个反直觉的点切成传输文件并不是因为 adb 需要文件传输而是因为这个模式会激活完整的 USB 复合设备描述符adb 接口才会被一并枚举出来。理解了这一层你就不会觉得这个操作是在碰运气。2.3 RSA 授权弹窗没弹出来怎么办正常情况下第一次在一台电脑上启用 USB 调试手机会弹一个是否允许 USB 调试的对话框里面带一串 RSA 密钥指纹。如果你手快点了拒绝或者勾了一律允许之后又想换电脑就会出现unauthorized状态而且弹窗不再出现。这个时候的处理方式是进开发者选项找到撤销 USB 调试授权点一下把之前记住的授权全部清空然后重新插拔数据线弹窗就会再次出现。还有一种情况是弹窗压根没弹。这种多半是数据线只有充电功能或者 USB 端口供电不足导致枚举不完整。换一根原装线、换到机箱后面的 USB 口往往就好了。我自己的经验是随手抓的那种十几块钱的充电线里有相当一部分是没有数据引脚的这类线插上去手机能充电但电脑完全感知不到设备非常具有迷惑性。3. 电脑这一侧驱动、adb 版本和端口占用三件套手机端确认没问题之后问题基本就落在电脑上。这一层的三个原因按出现频率排序依次是Windows 驱动、adb 版本错配、5037 端口被占用。3.1 Windows 上到底装没装 ADB 驱动在 Windows 里最直接的验证方式是打开设备管理器。插上手机之后观察有没有新出现的条目如果出现在其他设备下面并带一个黄色感叹号说明驱动没装好通常显示为Android或ADB Interface的未知设备。如果出现在便携设备下面只能说明 MTP 文件传输驱动装上了不代表 adb 驱动可用。正常状态下应该能看到Android Phone → Android Composite ADB Interface或者类似的条目。解决方式有两种。第一种是通过 Android Studio 的 SDK Manager 安装 Google USB Driver然后在设备管理器里手动指定驱动路径更新。第二种是安装通用的 ADB 驱动包覆盖那些 Google 驱动不认的厂商机型。国产 ROM 在这块尤其麻烦很多机型需要装厂商自己的手机助手套件才能把 ADB 接口驱动带出来装完之后可以卸载助手本体驱动会保留。注意装完驱动之后一定要重新插拔一次数据线让系统重新枚举设备。驱动更新后不重新枚举设备管理器里可能仍显示旧状态容易让人误判。3.2 你终端里的 adb 和 Android Studio 用的可能不是同一个这是我自己踩过最久的一个坑。机器上装了两三个不同的 SDK 副本PATH 里指向的是旧版本 adb而 Android Studio 的 SDK 路径指向新版本两边版本号不一致的时候adb server 会出现一方把另一方踢掉的情况于是你在终端看到设备正常回到 IDE 里列表是空的或者反过来。判断方法是分别执行which adb # macOS / Linux where adb # Windows adb version # 看输出的版本号和路径然后再去 Android Studio 的Settings → Languages Frameworks → Android SDK → SDK Tools里确认Android SDK Platform-Tools是已安装状态并记下 SDK 的根目录路径把里面的platform-tools目录加到系统 PATH 的最前面。顺带说一句把 IDE 界面切成中文很多人搜的Android Studio 汉化中文语言包只会影响菜单文字和设备识别没有任何关系设备列表为空时不需要往这个方向折腾。3.3 5037 端口被占用是一个隐蔽杀手adb 服务默认监听本机的 5037 端口。如果有别的程序已经占了这个端口adb 启动时会直接失败表现就是所有设备都消失。这类占用通常来自其他开发工具自带的 adb 副本或者某些手机助手类软件的后台服务。查起来很简单# Windows netstat -ano | findstr 5037 # macOS / Linux lsof -i :5037拿到进程号之后判断这个进程是不是必需的。如果确认是某个助手类软件或者残留进程占着结束它然后adb kill-server adb start-server重启服务。我一般会把这套命令做成一个脚本遇到设备消失先跑一遍八成问题当场解决。4. 厂商 ROM 的隐藏开关明明都开了但还是连不上如果你已经确认开发者选项开了、USB 调试开了、线是好的、驱动也装了adb 却依然看不到设备那大概率撞上了厂商 ROM 的额外限制。这一层是纯经验活官方文档里基本不会写。4.1 小米系USB 调试之外还有安全设置小米和 Redmi 的开发者选项里除了USB 调试还有一个USB 调试安全设置。这个开关的作用是允许通过 USB 调试修改系统设置或模拟点击它默认是关闭的而且打开时会要求登录小米账号并等待一段时间才能生效。普通调试不一定需要它但如果你要做自动化测试或者用工具抓取界面不开这个开关很多操作会被系统直接拦掉。另外小米的USB 调试自动撤销授权如果被打开超过一定时间没有操作就会自动清空授权表现出来就是用着用着设备突然消失了。4.2 华为与荣耀HDB 是另一条通道华为系机型在开发者选项里通常有一个和 HDB 相关的开关用来允许电脑端的手机助手通过 HDB 协议连接。某些系统版本下如果这个开关没打开普通 adb 连接也会受影响。此外华为的仅充电模式下允许 ADB 调试是个非常实用的选项打开之后即使 USB 用途选的是仅充电adb 也能正常工作省掉了每次插线都要切换模式的动作。4.3 vivo、OPPO 与部分定制 ROM 的限流机制vivo 和 OPPO 的开发者选项里同样有USB 调试安全设置类似的条目需要额外确认开启。更麻烦的是部分 ROM 会做调试权限限流短时间内反复插拔、反复授权系统会暂时拒绝新的授权请求表现为弹窗不出现、设备一直是 unauthorized。遇到这种情况别硬刚进开发者选项点撤销 USB 调试授权然后等几分钟再试通常就能恢复。至于无线调试这些机型在 Android 11 之后都支持了官方的无线调试配对功能反而比 USB 更省心后面会单独讲。4.4 第三方套件和残留驱动会打架装了某家手机助手之后它会在后台常驻一个自己的 adb 服务还会接管 USB 设备的驱动绑定。这时候你系统里的 adb 版本和它自带的版本互相抢设备结果就是时好时坏。我的处理原则是调试机上不装任何手机助手类软件需要装驱动就单独装驱动包装完把助手本体卸掉。如果已经装过务必确认它的后台进程没有在跑否则前面提到的 5037 端口占用问题会反复出现。5. 设备能看到了但部署还是失败把两类问题分开有一类求助听起来和标题一样其实性质完全不同设备列表里明明有手机点 Run 却报错。这不是找不到手机而是找到了但装不上。把这两类问题混在一起排查会浪费大量时间。5.1 先看目标设备有没有选中Android Studio 顶部的运行配置里有一个Deploy Target Options默认可能是Open Select Deployment Target Dialog也可能是Use same device for future launches。如果之前手动选过某台已经拔掉的设备IDE 会一直尝试往那台设备部署然后提示找不到设备。这时候点开运行配置把目标设备手动改成当前连接的设备即可。多设备场景下我建议保留弹窗选择避免误部署。5.2 部署阶段的报错怎么读常见的几种报错和对应方向报错关键字大致方向INSTALL_FAILED_USER_RESTRICTED厂商 ROM 拦截需要开 USB 安装权限或USB 调试安全设置INSTALL_FAILED_INSUFFICIENT_STORAGE手机存储不足清理空间INSTALL_FAILED_UPDATE_INCOMPATIBLE签名不一致先卸载手机上已有的同包名应用INSTALL_FAILED_VERSION_DOWNGRADE安装的版本号低于已装版本卸载或提升版本号Device unauthorized回到第 2.3 节处理授权Unable to locate adbplatform-tools 路径错误回到第 3.2 节INSTALL_FAILED_USER_RESTRICTED在国产 ROM 上出现的频率特别高它的本质是系统层禁止了通过 adb 安装应用需要在开发者选项里打开对应权限或者把 USB 用途切到文件传输后再试。5.3 重装和清缓存什么时候才有用我不否认File → Invalidate Caches / Restart偶尔能解决问题但它只对 IDE 自身状态错乱有效比如设备列表卡在旧快照上。如果adb devices本身就是空的清一百次缓存也没用。判断标准很简单终端能看到的IDE 看不到才轮到清缓存和重启 IDE终端都看不到就老老实实从第 1 节开始往下查。6. 无线调试把线拔掉反而更稳定USB 连接受线材、接口、驱动的影响太大所以只要条件允许我现在的调试基本都走无线。Android 11 之后官方内置了无线调试功能不再需要先插线初始化体验好了很多。6.1 老办法adb tcpip 加 connect在手机和电脑处于同一局域网的前提下先用 USB 连一次然后执行adb tcpip 5555 # 让手机在 5555 端口监听 adb shell ip route # 或者去手机设置里查当前 IP adb connect 192.168.1.100:5555 # 用查到的 IP 连接 adb devices # 确认出现 192.168.1.100:5555 device连上之后就可以拔线了。这个方法的局限是必须先有一次成功的 USB 连接而且手机重启后需要重新初始化。6.2 新办法Android 11 之后的无线调试配对进入开发者选项打开无线调试选择使用配对码配对设备系统会给出一个 IP 端口和一个六位配对码。然后在电脑上执行adb pair 192.168.1.100:37000 # 端口和配对码以手机上显示的为准 # 按提示输入六位配对码 adb connect 192.168.1.100:5555 # 配对成功后再连接调试端口这里最容易搞混的是配对端口和调试端口是两个不同的端口号必须严格照手机上显示的数字来输。另外如果公司网络做了客户端隔离同一 Wi-Fi 下设备之间互相 ping 不通无线调试就连不上这种情况需要换个网络环境或者退回 USB。6.3 多设备时的 -s 参数和端口转发同时连了两台以上设备时几乎所有 adb 命令都需要用-s指定序列号否则会报more than one deviceadb -s 192.168.1.100:5555 install app-debug.apk adb -s 192.168.1.101:5555 logcat建议养成先adb devices看清单、再用-s指定目标的习惯尤其是做自动化脚本的时候不指定设备的命令行为在单机环境下正常在多机环境下会莫名其妙地失败。7. 我自己的六分钟排查顺序把上面这些串起来遇到Android Studio 找不到连接的手机我现在固定按这个顺序走基本不会超过十分钟adb devices先确认底层有没有设备把问题切分成两半。有设备但 unauthorized去开发者选项撤销授权后重新插拔。没设备换一根确定能传数据的原装线换到机箱后置 USB 口。还是没设备看设备管理器有没有 ADB Interface 相关条目补驱动。驱动正常检查adb version和 Android Studio 的 platform-tools 路径是否一致。检查 5037 端口占用结束冲突进程后重启 adb 服务。以上都正常回头确认厂商 ROM 的隐藏开关比如USB 调试安全设置。最后才是清 IDE 缓存和重启 Android Studio。这套顺序的核心逻辑是从底层往上查、从低成本往高成本查因为换线、敲一条命令的成本远低于重装驱动和 IDE。反过来的顺序之所以容易失败是因为在高成本的步骤里你很难判断自己到底有没有解决真正的问题。最后分享两个我自己养成的小习惯。第一调试机上永远备一根写明了支持数据传输的短线和一根 Type-C 转接头这是最便宜的排障工具比任何软件手段都立竿见影。第二把adb kill-server adb start-server adb devices做成一个别名或者批处理脚本放在顺手的位置设备列表异常时先跑一遍——我统计过这套动作能解决我遇到的一半以上的连接问题剩下的那一半多半是那台手机又在开发者选项里偷偷给你关掉了什么开关。
返回列表