1. 为什么 adb 值得你花半小时装好
如果你正在看这篇文章,大概率是遇到了下面几种情况之一:手机连上电脑没反应,设备管理器里躺着一个带黄色感叹号的未知设备;或者你刚下载了一个 adb 工具包,解压完双击adb.exe,黑框一闪就没了,什么都没发生;再或者你在命令行敲了adb devices,结果返回一个空列表,甚至弹出一句adb server version (31) doesn't match this client (41); killing...,然后就没有然后了。
这些场景我全都踩过,而且不止一次。adb 这个东西,全称 Android Debug Bridge,翻译过来叫安卓调试桥,本质上是电脑和安卓设备之间的一条命令行通道。它不是什么高深的东西,但它的安装和配置过程,恰恰是新手最容易卡住的地方——因为它不像普通软件那样双击安装就完事,它需要你手动配置环境变量、装驱动、处理端口占用、应对版本冲突,每一步都有坑。
装好 adb 之后你能做什么?往小了说,你可以用adb install直接给手机装应用,用adb pull把手机里的文件拽到电脑上,用adb shell进到安卓系统的命令行里翻文件、改设置。往大了说,你可以用adb logcat抓取应用运行日志来排查崩溃,用adb shell uiautomator dump导出界面层级做自动化测试,用adb shell wm调整屏幕方向做批量截图,甚至用adb shell locksettings set-disabled true临时关掉锁屏密码。做安卓开发、做自动化测试、做手机批量管理、搞机折腾,adb 都是绕不开的第一块敲门砖。
这篇文章面向的是完全没有接触过 adb 的新手,也适合那些装过但没装明白、每次用都要重新折腾一遍的人。我会从零开始,把 Windows 平台下 adb 的下载、解压、环境变量配置、驱动安装、连接验证、常见报错排查全部讲清楚,每一步都告诉你为什么这么做,以及不这么做会出什么问题。你跟着走一遍,半小时之内应该能跑通。
2. 装之前先把这几个概念搞清楚
2.1 adb 到底是什么,它和 Android SDK 是什么关系
很多人第一次搜 adb 安装教程,搜出来的结果会让他去下载一个几十 GB 的 Android Studio,然后通过 SDK Manager 去装 platform-tools。这个路径没错,但对于只是想用 adb 命令的人来说,属于杀鸡用牛刀。
adb 的可执行文件其实就三个:adb.exe、AdbWinApi.dll、AdbWinUsbApi.dll,它们都躺在 Android SDK 的platform-tools目录里。Google 官方单独提供了 platform-tools 的独立压缩包,你不需要装整个 Android Studio,直接下载这个包解压就能用。这是最省事的路径,也是我推荐给所有非安卓开发者的方式。
那 adb 和 fastboot 又是什么关系?fastboot 是刷机模式下用的工具,通常和 adb 放在同一个 platform-tools 包里。你解压之后会看到adb.exe和fastboot.exe都在,两个一起配好环境变量,以后刷机调试都不用来回找路径。
2.2 为什么 adb 需要配环境变量
这是新手最容易忽略的一步。你把 platform-tools 解压到D:\platform-tools,然后在那个文件夹里打开命令行敲adb devices,能用。但一旦你切换到别的目录,比如C:\Users\你的用户名,再敲adb,系统就告诉你"不是内部或外部命令"。
原因很简单:Windows 的命令行在执行一个命令时,会去几个固定的目录里找这个命令对应的可执行文件,这些目录就是环境变量Path里列出的路径。你把 platform-tools 的路径加进Path,系统就能在任何目录下找到adb.exe。不配环境变量,你就得每次都cd到 platform-tools 目录,或者敲完整路径D:\platform-tools\adb.exe devices,非常麻烦。
提示:环境变量配置完之后,必须重新打开一个新的命令行窗口才会生效。已经开着的窗口读的是旧的环境变量,这一点坑过无数人。
2.3 手机端需要做什么准备
电脑这边配好了,手机那边也得配合。安卓设备默认是关闭 USB 调试的,你需要手动打开开发者选项。具体路径一般是:设置 → 关于手机 → 连续点击"版本号"七次,直到提示"你已进入开发者模式"。然后返回设置 → 系统 → 开发者选项 → 打开"USB 调试"。
不同品牌的手机路径略有差异。小米在"设置 → 我的设备 → 全部参数"里点 MIUI 版本号;华为在"设置 → 关于手机"里点版本号;OPPO 和 vivo 类似。老款创维电视或者机顶盒要打开 adb,通常是在"关于"页面里连续按遥控器的某个键,或者进入工厂模式,这个因设备而异,需要单独查对应型号的方法。
打开 USB 调试之后,手机连上电脑,会弹出一个"是否允许 USB 调试"的授权弹窗,勾选"始终允许"并确定。这一步没做的话,adb devices会显示unauthorized,后面会详细讲怎么处理。
3. Windows 平台 adb 安装全流程实操
3.1 下载 platform-tools 压缩包
打开浏览器,搜索"platform-tools download",找到 Google 官方的开发者页面。页面上会有 Windows、Mac、Linux 三个版本的下载链接,选 Windows 版,下载下来是一个 zip 压缩包,文件名类似platform-tools-latest-windows.zip,大小在 10MB 左右。
网上也有很多第三方打包好的"adb 工具包",比如各种"adb 工具 1.0.32.zip 电脑版免费版"之类的。这些包本质上就是把官方 platform-tools 重新压缩了一遍,有些还附带了驱动和批处理脚本。用是可以用的,但我建议你尽量从官方渠道下载,避免第三方包里夹带了旧版本或者不明修改。版本太旧会导致后面说的 server version 不匹配问题。
3.2 解压到合适的目录
下载完之后,把 zip 解压到一个你记得住的、路径里没有中文和空格的目录。我一般放在D:\platform-tools,也有人放在C:\adb。为什么不放桌面或者"下载"文件夹?因为那些路径里往往带中文用户名,比如C:\Users\张三\Desktop,adb 在某些场景下对中文路径处理不好,容易出现莫名其妙的错误。路径里带空格也一样,比如C:\Program Files\adb,命令行解析时可能出问题。
解压完之后打开这个目录,确认里面能看到adb.exe、fastboot.exe、AdbWinApi.dll、AdbWinUsbApi.dll这几个文件。如果只有 exe 没有 dll,说明解压不完整,重新解压一次。
3.3 配置环境变量
这一步是核心。右键"此电脑" → 属性 → 高级系统设置 → 环境变量。你会看到上下两个区域,上面是"用户变量",下面是"系统变量"。找到系统变量里的Path,选中它,点"编辑"。
在弹出的窗口里点"新建",把D:\platform-tools这个路径粘贴进去,然后一路确定。注意不要删除原有的任何条目,只是新增一条。
如果你用的是 Windows 10 之前的系统,Path 可能是一长串用分号隔开的文本,你需要在末尾加一个分号,再追加你的路径,比如;D:\platform-tools。Windows 10 和 11 都是列表式的,直接新建一行就行。
配完之后,按 Win+R 输入cmd打开一个新的命令行窗口,敲adb version。如果返回类似Android Debug Bridge version 1.0.41的信息,说明环境变量配好了。如果提示"不是内部或外部命令",检查三件事:路径有没有写错、有没有重新开窗口、Path 里是不是加到了用户变量而不是系统变量(加到用户变量其实也行,但只对当前用户生效)。
3.4 安装 adb 驱动
环境变量配好只是让电脑认识 adb 命令,但电脑要真正和手机通信,还需要驱动。Windows 10 和 11 通常会自动识别大部分安卓设备并安装通用驱动,但国产手机和杂牌设备经常识别不了,设备管理器里会显示一个带感叹号的"Android"或者"ADB Interface"。
遇到这种情况,需要手动装驱动。最通用的方案是装 Google 的 USB 驱动,它在 Android SDK 里可以下载到,也可以单独搜"Google USB Driver"下载。下载解压后,在设备管理器里右键那个带感叹号的设备 → 更新驱动 → 浏览我的电脑 → 指向你解压的驱动目录 → 下一步。装完之后感叹号消失,设备正常识别。
国产手机厂商一般也提供自己的驱动,比如小米、华为、OPPO 都有官方的 USB 驱动包,去官网搜"XX USB 驱动"就能找到。如果通用驱动不行,就换厂商驱动试试。
注意:有些手机连接电脑后默认是"仅充电"模式,需要下拉通知栏把 USB 连接方式改成"传输文件"或者"MIDI",adb 才能识别。这个细节很多人不知道,折腾半天以为是驱动问题,其实只是模式没切。
3.5 验证连接
驱动装好、USB 调试打开、手机授权弹窗点了允许之后,在命令行敲:
adb devices正常的话会返回类似这样的输出:
List of devices attached ABCD1234 device前面那串是设备序列号,后面device表示设备已连接且已授权。如果显示unauthorized,说明授权弹窗没点或者被拒绝了,看下一节的排查方法。如果列表是空的,说明电脑根本没识别到设备,回到驱动那一步检查。
4. 高频报错逐个击破
4.1 adb server version 不匹配
这个报错长这样:
adb server version (31) doesn't match this client (41); killing...意思是电脑上已经有一个旧版本的 adb server 在运行(版本 31),而你当前敲的 adb 客户端是新版本(41),两者对不上,新客户端把旧 server 杀掉了。这种情况通常是因为你电脑上装了多个 adb,比如 Android Studio 自带一个,你手动下载的 platform-tools 又是一个,两个版本不一致。
解决办法很简单:先adb kill-server杀掉所有 adb 进程,然后确认你当前命令行调用的 adb 是哪个版本(adb version),把其他路径下的旧 adb 从环境变量里移除,或者直接用新版本覆盖旧版本。最彻底的方式是全局搜索电脑里所有的adb.exe,只保留最新的一份,其余的重命名或者删掉。
4.2 adb unauthorized 怎么解决
adb devices显示unauthorized,说明手机没有授权这台电脑。处理步骤:
- 拔掉 USB 线,重新插上,看手机有没有弹出授权窗口。
- 如果没弹窗,进入开发者选项,找到"撤销 USB 调试授权",点一下,然后重新插线。
- 弹窗出现后,勾选"始终允许来自这台计算机",点确定。
- 如果还是不弹,检查手机是不是处于锁屏状态,解锁后再试。
- 部分手机需要在开发者选项里额外打开"USB 调试(安全设置)"才能授权。
我遇到过一种情况是数据线本身有问题,只能充电不能传数据,换根线就好了。所以排查的时候,线材也是要怀疑的对象。
4.3 daemon not running 和端口占用
有时候敲 adb 命令会看到:
* daemon not running; starting now at tcp:5037 could not read ok from adb serveradb 的 server 默认监听 5037 端口,如果这个端口被别的程序占用了,server 就起不来。常见占用者是 360 手机助手、豌豆荚、各种手机管家类软件,它们内部也用了 adb。
排查方法是在命令行敲netstat -ano | findstr 5037,找到占用端口的进程 PID,然后去任务管理器里结束那个进程。或者直接把这些手机助手类软件退出,再重启 adb server。
4.4 Windows 10 管理员找不到 adb
有朋友反馈说用管理员身份打开命令行,敲 adb 提示找不到命令,但普通窗口能用。这是因为环境变量配在了用户变量里,管理员账户读的是另一套用户变量。解决办法是把 platform-tools 路径加到系统变量的 Path 里,这样所有用户包括管理员都能用。
4.5 adb shell uiautomator dump 用不了
做自动化测试的朋友经常用adb shell uiautomator dump导出界面层级,但有时候会报错说无法写入或者文件为空。常见原因是目标路径没有写权限,或者界面正在动态刷新导致 dump 失败。可以指定输出到/sdcard目录:
adb shell uiautomator dump /sdcard/window_dump.xml adb pull /sdcard/window_dump.xml如果还是失败,检查设备是不是处于锁屏状态,uiautomator 在锁屏时无法获取界面层级。
5. adb 常用命令速查与实战场景
5.1 设备管理类命令
| 命令 | 作用 | 典型场景 |
|---|---|---|
adb devices | 列出已连接设备 | 确认连接状态 |
adb connect IP:端口 | 无线连接设备 | 免数据线调试 |
adb disconnect | 断开无线连接 | 切换设备 |
adb kill-server | 杀掉 adb 服务 | 解决端口冲突 |
adb start-server | 启动 adb 服务 | 重置连接 |
adb reboot | 重启设备 | 远程重启 |
adb reboot bootloader | 重启到 fastboot | 刷机前准备 |
无线调试是这两年越来越常用的功能。操作方式是先用 USB 连上,敲adb tcpip 5555让设备在 5555 端口监听,然后拔掉线,敲adb connect 手机IP:5555。手机 IP 可以在 WiFi 设置里看到。连上之后就能无线敲命令了,做演示或者测试很方便。
5.2 应用管理类命令
adb install app.apk # 安装应用 adb install -r app.apk # 覆盖安装,保留数据 adb uninstall com.example # 卸载应用 adb shell pm list packages # 列出所有包名 adb shell pm list packages -3 # 只列第三方应用 adb shell am start -n com.example/.MainActivity # 启动应用 adb shell am force-stop com.example # 强制停止应用adb install有个常见坑:如果应用已经存在且签名不一致,会报INSTALL_FAILED_UPDATE_INCOMPATIBLE,这时候需要先卸载再装,或者用-r参数覆盖。另外安装大文件时如果超时,可以加-t允许测试包,或者检查 USB 连接稳定性。
5.3 文件传输与截图
adb pull /sdcard/DCIM/Camera/IMG_001.jpg D:\photos\ # 从手机拉到电脑 adb push D:\file.txt /sdcard/ # 从电脑推到手机 adb shell screencap -p /sdcard/screen.png # 手机截图 adb pull /sdcard/screen.png D:\screens\ # 把截图拉到电脑"adb 截图保存电脑"是很多人搜的需求。上面两条命令组合起来就是完整的截图流程。如果你嫌麻烦,可以写一个批处理脚本,把这两条命令包进去,双击就自动截图并保存到指定目录。做批量截图的时候,配合adb shell wm size获取分辨率,可以精确控制截图区域。
5.4 日志抓取
adb logcat # 实时输出全部日志 adb logcat -c # 清空日志缓冲 adb logcat -v time > log.txt # 带时间戳输出到文件 adb logcat -s TAG # 只看指定 TAG adb logcat *:E # 只看 Error 级别抓日志排查崩溃是 adb 最实用的功能之一。应用闪退时,先adb logcat -c清空,然后复现问题,再adb logcat -v time > crash.log把日志导出来,搜索FATAL EXCEPTION就能定位到崩溃堆栈。注意日志量很大,长时间抓取会生成几百 MB 的文件,建议加上过滤条件。
5.5 系统设置类命令
adb shell wm size # 查看屏幕分辨率 adb shell wm density # 查看屏幕密度 adb shell wm size 1080x1920 # 修改分辨率 adb shell wm size reset # 恢复默认分辨率 adb shell settings put system screen_off_timeout 600000 # 设置息屏时间 adb shell locksettings set-disabled true # 关闭锁屏密码adb shell wm设置屏幕方向在自动化测试里很有用,可以强制应用横屏或竖屏。locksettings set-disabled true可以临时关掉锁屏密码,方便自动化脚本无人值守运行,但用完记得改回来,不然安全性会下降。
6. 我踩过的坑和几条实用建议
第一个坑是版本混乱。我电脑上同时装了 Android Studio、独立 platform-tools、还有一个第三方手机助手自带的 adb,三个版本各不相同。每次敲命令都要先确认当前用的是哪个,后来我把其他全部清理掉,只留一份最新的,世界就清净了。如果你也遇到各种莫名其妙的报错,先查一下电脑里有几个 adb。
第二个坑是数据线。有次帮同事调设备,折腾了一个小时驱动和授权,最后发现是那根线只能充电不能传数据。所以排查问题时,换一根确认能传数据的线,是最快的排除法。
第三个坑是中文路径。我曾经把 platform-tools 放在D:\工具\adb下面,结果某些命令执行时报编码错误。后来改成纯英文路径D:\platform-tools,问题消失。adb 对中文路径的支持确实不够好,能避则避。
第四个坑是授权弹窗被忽略。手机连上电脑后弹窗一闪而过,没注意就点了拒绝,然后adb devices一直显示unauthorized,还以为是驱动问题。后来养成习惯,插上线之后先看手机屏幕有没有弹窗,有就点允许。
最后分享一个提高效率的小技巧:把常用的 adb 命令写成批处理脚本或者 shell 脚本,比如一键截图、一键抓日志、一键安装。我自己的tools目录下放了十几个.bat文件,双击就能执行,比每次敲命令快得多。做自动化测试的朋友还可以把 adb 命令集成到 Python 脚本里,用subprocess调用,配合adb shell uiautomator dump做界面元素定位,整套流程跑下来非常顺畅。
adb 这个东西,装的时候麻烦,用起来是真香。花半小时把环境配好,后面省下的是无数个小时的折腾时间。