adb 常用命令:从连接到诊断
做性能优化,手里没几把好用的工具可不行。adb 就是我工具箱里最常用的瑞士军刀。说白了,它是 Android Debug Bridge,能让你在电脑上指挥手机干这干那。我刚开始接触 Android 时,就靠这几条命令吃饭。今天咱们把最常用的五个命令掰开揉碎讲讲。
1. adb devices —— 先确认手机连没连上
每次开始调优,我第一件事就是敲 adb devices。这命令检测哪些设备在线,以及授权状态。你想想看,如果设备没连上,后面的命令全是白搭。
$ adb devices
List of devices attached
emulator-5554 device
R58MA3C8V7G device
正常情况会显示 device。如果显示 unauthorized,说明手机弹了授权对话框你没点允许。我曾经因为忙着写代码,忘了点授权,查了半天问题,结果就是少点了个按钮。
我的习惯:每次插新设备先跑一次 adb devices。如果连接多个设备,用 adb -s <serial> 指定目标。
2. adb shell —— 钻进手机的肚子里
adb shell 就是给你一个远程终端,可以在手机上直接执行 Linux 命令。我经常用它来查看 CPU 频率、内存占用、进程列表。
$ adb shell
generic_x86:/ $ top -n 1
Tasks: 224 total, 1 running, 223 sleeping, 0 stopped, 0 zombie
Mem: 1882432K used, 213458K free, 102400K shrd, 6832K buff
Swap: 0K used, 0K free
$ exit # 退出 shell
你也可以不进入交互模式,直接跟命令:
$ adb shell dumpsys meminfo com.example.app
这样做的好处是脚本化,方便批量收集数据。我写过一些自动化脚本,就是靠 adb shell 加各种系统命令来采集性能数据的。
3. adb logcat —— 看日志就像看监控
做性能优化,日志是主要信息来源。但全量日志太吵了,我一般会用过滤。你想想看,刷屏的日志里怎么找到你想要的那一行?
$ adb logcat -v time *:E # 只看 Error 级别
$ adb logcat -v time | grep "MyTag" # 过滤指定标签
$ adb logcat -c # 清空旧日志
-v time 是我最常用的,带上时间戳方便对照问题发生的时刻。有一次线上卡顿问题,我就是靠 adb logcat -v time -b main 抓到了某个第三方 SDK 的高频日志,定位到它在主线程写文件。
注意:性能测试时尽量不要一直挂着 logcat,它本身也会消耗一点资源。需要时再开,用完就关。
4. adb dumpsys —— 系统信息的百宝箱
这命令能拿到几乎所有系统服务的状态。电池、内存、CPU、Activity 栈、Window 信息……我通常用它来获取内存快照和帧率数据。
| 命令 | 作用 |
|---|---|
adb dumpsys meminfo | 查看进程内存占用(PSS、Java Heap、Native Heap) |
adb dumpsys gfxinfo | 获取最近 128 帧的渲染时间和 jank 信息 |
adb dumpsys battery | 电池状态、温度、电量 |
adb dumpsys cpuinfo | 各进程 CPU 占用 |
举个实际例子,我想知道某个页面掉帧情况:
$ adb shell dumpsys gfxinfo com.example.app
Profile data in ms:
draw prepare process execute
0.25 0.12 0.08 0.30
0.30 0.15 0.10 0.35
16.8 0.20 0.12 0.40 ← 这帧超标了
看到超过 16ms 的帧,我基本就能断定这里有动画或布局问题了。我习惯把这个输出保存下来,跟不同版本对比。
实用技巧:配合 adb shell dumpsys 和 grep 可以快速定位。比如只看 Activity 栈:adb shell dumpsys activity | grep "mResumedActivity"
5. adb bugreport —— 一键生成体检报告
这个命令会把手机当前的系统日志、dumpsys 输出、dumpstate 等信息打包成一个 zip 文件。我遇到疑难杂症时,首选它。
$ adb bugreport bugreport_20250101.zip
生成的文件包含了 bugreport-xxx.txt 和 dumpstate-xxx.txt,里面记录了系统从开机到现在的各种信息,包括 WIFI、蓝牙、Sensor、App 崩溃、ANR 等。我记得有一次线上 ANR 率突然飙高,就是靠 bugreport 里的一条 "Input dispatching timed out" 锁定了问题进程。
不过要提醒你:这个命令耗时比较长(十几秒到一分钟),而且生成的文件很大(可能几十 MB)。生产环境慎用,最好在测试阶段用。
我的做法:在性能压测前跑一次 adb bugreport 作为基线;压测结束后再跑一次,对比两次的差异。
好了,这五个命令足够你应付大部分日常诊断了。从设备连接(devices),到进入系统(shell),到查看日志(logcat),再到系统状态(dumpsys),最后生成全量报告(bugreport),一条链路下来,没有搞不定的问题。下次遇到奇怪的现象,不妨先从这几个命令入手试试看。