1. 为什么 ADB 值得花时间学:从调试工具到效率杠杆
很多人第一次接触 ADB,是在手机连不上电脑、想传个文件却找不到数据线驱动的时候。当时我也一样,以为它就是个“安卓版的命令行传文件工具”,直到后来做自动化测试、批量装应用、抓日志排查线上问题,才发现这东西远不止传文件那么简单。ADB 全称 Android Debug Bridge,翻译过来叫“安卓调试桥”,本质是一个客户端-服务端架构的命令行工具,让你能在电脑上直接跟安卓设备对话。它能干的事包括但不限于:安装卸载应用、查看运行日志、模拟点击滑动、抓取屏幕截图、修改系统设置、甚至进入设备的 shell 环境执行 Linux 命令。
这篇文章适合谁看?如果你是刚入行的移动端测试、安卓开发、或者做自动化脚本的工程师,那 ADB 是你绕不开的基本功。如果你只是普通用户,想用电脑管理手机里的文件、批量卸载预装应用,ADB 也能帮你省下不少时间。我见过太多人卡在“设备识别不到”这一步就放弃了,其实只要把驱动、授权、端口这几个环节理顺,后面就是一马平川。接下来我会从安装配置讲到常用命令,再到实际排查问题的思路,尽量把踩过的坑都摊开来说清楚。
2. 环境搭建:把 ADB 装明白的完整流程
2.1 下载与安装:别去乱七八糟的网站找
ADB 本身是 Android SDK 里的一个组件,但大多数人不需要装完整的 SDK。最省事的做法是直接下载 Google 官方提供的 Platform Tools 压缩包,里面就包含了 adb、fastboot 等工具。我试过好几个第三方打包的“ADB 工具箱”,说实话,版本参差不齐,有些还捆绑了广告软件,所以强烈建议只从官方渠道拿。
下载下来是个 zip 包,解压到一个你记得住的路径,比如C:\platform-tools或者~/platform-tools。解压完你会看到adb.exe(Windows)或adb(macOS/Linux)这个可执行文件。注意,不要把它放在中文路径或者带空格的目录下,否则后面配置环境变量或者执行命令时容易出莫名其妙的错误。我有个朋友把工具放在“我的文档/安卓工具”下面,结果 adb 死活启动不了,排查了半天才发现是路径里的中文和空格在作祟。
2.2 配置环境变量:让命令行随处可用
解压完直接双击 adb.exe 是没用的,它会一闪而过。正确做法是把 platform-tools 目录加到系统的 PATH 环境变量里。Windows 上的操作是:右键“此电脑” → 属性 → 高级系统设置 → 环境变量 → 在“系统变量”里找到 Path → 编辑 → 新建 → 把C:\platform-tools填进去。macOS 或 Linux 用户则是在~/.bashrc或~/.zshrc里加一行export PATH=$PATH:~/platform-tools,然后执行source ~/.zshrc让它生效。
配置完之后,打开一个新的终端窗口,输入adb version。如果能看到版本号输出,比如Android Debug Bridge version 1.0.41,那就说明装好了。这里有个细节:一定要开新的终端窗口,因为环境变量的修改只对新开的会话生效。我见过有人改完变量后在原来的窗口里反复敲命令,一直提示“adb 不是内部或外部命令”,急得不行,其实就是没重开窗口。
2.3 设备连接与驱动安装:识别不到设备怎么办
把手机用 USB 线连上电脑,然后在手机上进入“设置 → 关于手机 → 连续点击版本号七次”开启开发者模式,再回到“设置 → 开发者选项”里打开“USB 调试”。这一步是必须的,否则电脑根本不会理你。打开之后,手机通常会弹出一个“是否允许 USB 调试”的授权窗口,勾选“始终允许”再点确定。
然后在终端里敲adb devices。如果一切正常,你会看到类似这样的输出:
List of devices attached ABCD1234 device如果显示的是unauthorized,说明授权窗口没点或者被关掉了,重新插拔一下数据线,手机上会再次弹出授权提示。如果列表是空的,那大概率是驱动问题。Windows 用户可以去设备管理器里看看有没有带黄色感叹号的未知设备,有的话需要手动安装对应厂商的 USB 驱动。macOS 和 Linux 通常不需要额外装驱动,但 Linux 下可能需要配置 udev 规则,否则普通用户没有权限访问设备。
注意:有些数据线只能充电不能传数据,换一根线试试往往能解决一半的“设备识别不到”问题。这个坑我踩过不止一次。
3. 基础命令实操:从装应用到抓日志
3.1 应用管理:安装、卸载与查看包名
装应用最常用的命令是adb install,后面跟 APK 文件的路径。比如adb install ./app-debug.apk。如果设备上已经装了同一个应用,会提示失败,这时候可以加-r参数覆盖安装:adb install -r ./app-debug.apk。还有一个很实用的参数是-t,允许安装测试包,有些 debug 签名的 APK 不加这个参数会报错。
卸载应用需要知道包名,命令是adb uninstall 包名。问题来了,怎么知道包名?可以用adb shell pm list packages列出所有已安装应用的包名。这个列表通常很长,可以配合 grep 过滤,比如adb shell pm list packages | grep 关键词。另外,adb shell pm list packages -3只列出第三方应用,-s只列系统应用,排查问题时很有用。
查看当前前台应用的包名和 Activity,可以用adb shell dumpsys window | grep mCurrentFocus。这个命令在自动化测试里特别常用,比如你想知道某个操作之后跳到了哪个页面,直接看这个输出就行。我刚开始做自动化的时候,就是靠这个命令确认页面跳转是否符合预期的。
3.2 文件传输与截图录屏:比想象中好用
从电脑推文件到设备用adb push 本地路径 设备路径,比如adb push ./test.txt /sdcard/。反过来从设备拉文件到电脑用adb pull 设备路径 本地路径。这两个命令在传日志、导截图的时候特别方便。注意设备路径的写法,/sdcard/是内部存储的根目录,实际对应的是/storage/emulated/0/,两个路径都能用。
截图命令是adb shell screencap -p /sdcard/screen.png,然后再用adb pull拉到电脑上。如果想一步到位,可以写成adb exec-out screencap -p > screen.png,这样直接输出到本地文件,省去了先存到设备再拉取的步骤。录屏则是adb shell screenrecord /sdcard/demo.mp4,默认录制时长上限是 180 秒,按 Ctrl+C 可以提前停止。录屏文件同样需要 pull 出来才能看。
实操心得:
exec-out这个用法在 Windows 的某些终端里可能会有换行符问题,导致图片打不开。如果遇到这种情况,还是老老实实用screencap存到设备再 pull。
3.3 日志抓取:排查问题的第一手资料
adb logcat是使用频率最高的命令之一。直接敲adb logcat会刷屏,所以通常要加过滤条件。按优先级过滤用adb logcat *:E,只看 Error 级别以上的日志。按标签过滤用adb logcat -s TAG,比如adb logcat -s ActivityManager。还可以把日志输出到文件:adb logcat -v time > log.txt,-v time表示每行日志带上时间戳,方便后续分析。
清除日志缓冲区用adb logcat -c,这个命令在开始复现问题之前执行一下,可以避免旧日志干扰。另外,adb bugreport可以生成一份完整的系统诊断报告,包含日志、堆栈、系统状态等信息,适合在反馈复杂问题时使用。不过这个命令执行时间较长,生成的文件也比较大,日常调试还是 logcat 更轻量。
4. 进阶技巧与常见问题排查
4.1 无线调试:摆脱数据线的束缚
ADB 支持通过 Wi-Fi 连接设备,前提是设备和电脑在同一个局域网内。首先用 USB 线连上设备,执行adb tcpip 5555,让设备在 5555 端口监听。然后查看设备的 IP 地址,可以在“设置 → 关于手机 → 状态信息”里找到,或者执行adb shell ip addr show wlan0查看。最后执行adb connect 设备IP:5555,拔掉数据线,如果显示connected to 设备IP:5555,就说明无线连接成功了。
无线调试的好处是显而易见的,尤其是做自动化测试的时候,设备可以放在支架上自由移动,不用被线缆限制。但要注意,无线连接偶尔会断开,重新执行adb connect即可。如果连不上,先确认设备和电脑是否在同一个网段,再检查防火墙有没有拦截 5555 端口。
4.2 多设备管理:指定目标设备
当你同时连接了多台设备时,直接执行 adb 命令会报错,提示more than one device/emulator。这时候需要用-s参数指定设备序列号,比如adb -s ABCD1234 shell。序列号可以通过adb devices查看。如果觉得每次敲序列号太麻烦,可以设置环境变量ANDROID_SERIAL,比如export ANDROID_SERIAL=ABCD1234,这样后续命令默认就操作这台设备。
还有一种情况是设备显示为offline,这通常意味着 adb 服务端和设备端的连接出了问题。可以先执行adb kill-server再执行adb start-server重启服务,大部分情况下能解决。如果还不行,重启设备或者换一根数据线试试。
4.3 常见问题速查表
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
adb devices列表为空 | 驱动未安装或数据线不支持数据传输 | 安装厂商 USB 驱动,更换数据线 |
设备显示unauthorized | 未授权 USB 调试 | 重新插拔数据线,在手机上点击允许 |
adb 不是内部或外部命令 | 环境变量未配置或未生效 | 检查 PATH 配置,重开终端窗口 |
more than one device | 连接了多台设备 | 用-s 序列号指定设备 |
| 无线连接频繁断开 | 网络不稳定或设备休眠 | 保持设备唤醒状态,重新 connect |
install报错INSTALL_FAILED_TEST_ONLY | 安装的是测试包 | 加-t参数重新安装 |
4.4 几个容易被忽略的实用命令
adb shell input tap x y可以模拟点击屏幕上的某个坐标,adb shell input swipe x1 y1 x2 y2模拟滑动,adb shell input text "内容"模拟输入文本。这几个命令组合起来,就能写一些简单的自动化脚本。比如自动解锁屏幕、自动填写表单之类的。
adb shell dumpsys battery可以查看电池状态,adb shell dumpsys meminfo查看内存使用情况,adb shell dumpsys cpuinfo查看 CPU 占用。这些命令在性能测试和问题排查时很有价值。我遇到过应用卡顿的问题,就是用dumpsys cpuinfo发现某个后台进程一直在占用 CPU,定位到问题根源的。
adb shell settings put global可以修改系统设置,比如adb shell settings put global window_animation_scale 0关闭窗口动画,加快自动化测试的执行速度。这个技巧在跑 UI 自动化用例时特别管用,能省下不少等待时间。
5. 从命令到脚本:把 ADB 用出生产力
单独敲命令只是入门,真正提升效率的是把 ADB 命令组合成脚本。比如写一个批量安装应用的脚本,遍历某个目录下的所有 APK 文件,依次执行adb install -r。或者写一个日志抓取脚本,自动清除旧日志、启动应用、等待几秒、抓取日志并保存到带时间戳的文件里。这些脚本用 Bash 或者 Python 都能写,核心就是调用 subprocess 执行 adb 命令并处理输出。
我自己常用的一个脚本是“一键抓取崩溃日志”:先adb logcat -c清空缓冲,然后启动目标应用,等待用户操作,最后adb logcat -d *:E > crash.log导出所有 Error 级别日志。这个脚本在测试同事反馈崩溃问题时特别高效,不用反复指导他们怎么抓日志,直接跑脚本就行。
还有一个场景是批量截图。做 UI 走查的时候,需要把每个页面的截图都保存下来。可以写一个脚本,依次执行adb shell input tap点击各个入口,每次点击后adb exec-out screencap -p > 页面名.png。虽然比不上专业的自动化框架,但在临时任务里足够用了。
注意:脚本里执行 adb 命令时,建议加上超时机制,避免某条命令卡住导致整个脚本挂起。Python 的 subprocess 可以用
timeout参数,Bash 可以用timeout命令。
6. 我踩过的坑与最后分享的几个技巧
第一个坑是路径问题。前面提过中文路径和空格的问题,这里再强调一次,不仅是 platform-tools 的路径,push/pull 的文件路径也尽量用英文和数字,避免特殊字符。我有一次 pull 一个名字里带空格的文件,命令一直报错,后来用引号把路径包起来才解决。
第二个坑是权限问题。Linux 下普通用户访问 USB 设备需要 udev 规则,具体做法是在/etc/udev/rules.d/下新建一个规则文件,内容大概是SUBSYSTEM=="usb", ATTR{idVendor}=="厂商ID", MODE="0666"。厂商 ID 可以通过lsusb命令查看。配置完之后执行sudo udevadm control --reload-rules生效。这个步骤很多教程里没提,导致 Linux 用户一直卡在权限拒绝上。
第三个坑是 adb 版本与设备系统版本的兼容性。老版本的 adb 连接新系统的设备时,可能会出现各种奇怪的问题,比如安装失败、shell 命令无响应等。解决办法很简单,去官方下载最新的 platform-tools 替换掉旧的就行。我现在养成的习惯是每隔几个月就去官网看一眼有没有更新。
最后分享一个小技巧:adb shell进去之后,其实就是一个精简的 Linux 环境,可以用ls、cd、cat、ps等常用命令。但要注意,不同厂商的设备对 shell 命令的支持程度不一样,有些命令可能被裁剪掉了。如果发现某个命令不存在,不要怀疑自己,大概率是设备本身就没带这个工具。这种情况下可以试试用toybox或者busybox来补充,不过这就属于比较进阶的玩法了,日常调试用不到。
另外,如果你经常需要同时操作多台设备,可以考虑用adb -s配合 shell 脚本的循环来实现批量操作。比如批量安装应用、批量截图、批量抓日志,写一次脚本就能反复用。这种投入产出比很高的事情,值得花半个小时去折腾一下。