15、性能监控(上):adb shell dumpsys cpuinfo、meminfo、battery
性能监控,说白了就是给手机做体检。
你写了个App,跑起来卡不卡?内存有没有泄漏?电池是不是在偷偷掉电?这些问题,光靠肉眼是看不出来的。这时候就需要 dumpsys 这个工具了。
我个人习惯,每天上班第一件事,就是连上测试机跑一遍这三个命令。花不了两分钟,但能提前发现很多坑。
核心知识点:dumpsys 是 Android 系统提供的诊断服务,后面跟不同的参数,就能拿到不同模块的实时状态。
15.1 CPU 信息:adb shell dumpsys cpuinfo
这个命令用来查看当前系统的 CPU 占用情况。说白了,就是看看谁在抢 CPU 时间片。
adb shell dumpsys cpuinfo
输出大概长这样:
Load: 1.2 / 1.5 / 1.8
CPU usage from 0ms to 3000ms:
45% 1234/com.example.app: 30% user + 15% kernel / faults: 123 minor
20% 567/system_server: 12% user + 8% kernel
15% 890/com.android.launcher: 10% user + 5% kernel
20% idle
我来拆解一下:
- Load:系统负载,三个数字分别代表 1分钟、5分钟、15分钟的平均负载。超过 CPU 核心数就说明有点忙了。
- CPU usage:统计时间段内的 CPU 使用情况。
- user + kernel:用户态和内核态的占比。用户态是你的 App 代码,内核态是系统调用。
- faults:缺页中断次数。这个数字如果很大,说明内存可能不够用了。
我的经验:如果某个 App 的 CPU 占用长期超过 30%,而且是在后台,那基本可以断定有问题。我曾经遇到过一个推送 SDK,在后台疯狂轮询,CPU 占用飙到 50%,用户手机直接发烫。
15.2 内存信息:adb shell dumpsys meminfo
内存泄漏是 Android 开发的老大难问题。这个命令就是你的照妖镜。
adb shell dumpsys meminfo com.example.app
输出内容比较多,我挑重点说:
Applications Memory Usage (in Kilobytes):
Uptime: 12345678 ms
Realtime: 12345678 ms
** MEMINFO in pid 1234 [com.example.app] **
Pss Private Shared Private
Total Dirty Dirty Clean
Native Heap 10240 10000 1024 0
Dalvik Heap 8192 8000 512 0
Stack 128 128 0 0
Cursor 256 256 0 0
Ashmem 32 32 0 0
Other dev 512 512 0 0
.so mmap 2048 1024 512 512
.apk mmap 256 0 0 256
.ttf mmap 32 0 0 32
.dex mmap 1024 512 256 256
.oat mmap 128 0 0 128
.art mmap 2048 1024 512 512
Other mmap 256 128 64 64
EGL mtrack 4096 4096 0 0
GL mtrack 2048 2048 0 0
Unknown 1024 1024 0 0
TOTAL Pss: 32768
TOTAL RSS: 49152
TOTAL SWAP Pss: 2048
关键指标:
| 指标 | 含义 | 正常范围 |
|---|---|---|
| Pss Total | 按比例分摊后的物理内存 | 一般 App 在 50MB 以内 |
| Private Dirty | 独占且脏的内存,不能换出到磁盘 | 越小越好 |
| Native Heap | Native 层堆内存 | 注意是否有泄漏 |
| Dalvik Heap | Java 堆内存 | 注意 GC 后是否回落 |
避坑指南:我曾经遇到过一个图片加载库,每次加载图片都通过 JNI 创建 Native 对象,但忘记释放。结果 Native Heap 从 10MB 一路涨到 200MB,最后直接 OOM 崩溃。排查了三天才找到原因。
还有一个常用参数:
adb shell dumpsys meminfo -s
这个会按进程汇总,显示每个进程的 Pss 总量。适合快速定位哪个 App 吃内存最多。
15.3 电池信息:adb shell dumpsys battery
电池续航是用户最敏感的体验之一。这个命令能告诉你电池的实时状态。
adb shell dumpsys battery
输出示例:
Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
Max charging current: 500000
Max charging voltage: 5000000
Charge counter: 1234567
status: 2
health: 2
present: true
level: 85
scale: 100
voltage: 4200
temperature: 300
technology: Li-ion
重点看这几个:
- level:当前电量百分比。85 就是 85%。
- status:充电状态。2 表示正在充电,3 表示已充满,4 表示未充电。
- temperature:电池温度。单位是 0.1 摄氏度,300 就是 30 度。超过 400(40度)就要警惕了。
- voltage:电池电压。单位毫伏,正常在 3500-4300 之间。
调试技巧:如果你想模拟低电量场景,可以用这个命令:
adb shell dumpsys battery set level 5。把电量强制设为 5%,然后测试你的 App 在低电量下的表现。测试完记得用 adb shell dumpsys battery reset 恢复。
15.4 知识体系总览
这三个命令虽然各自独立,但组合起来就能全面了解设备的性能状态。我画了一张图帮你理清关系:
15.5 实战组合拳
光看单个命令还不够,我一般会这样组合使用:
- 先看电池:
dumpsys battery确认设备状态正常,温度不高。 - 再看 CPU:
dumpsys cpuinfo看看有没有异常进程在吃 CPU。 - 最后看内存:
dumpsys meminfo针对目标 App 做详细分析。
举个例子。有一次用户反馈 App 在后台耗电严重。我连上设备,先看电池温度,38度,偏高。再看 CPU,发现一个后台服务 CPU 占用 40%。最后看内存,发现这个服务里有个 HashMap 一直在增长,明显是泄漏了。修复后,耗电问题直接解决。
核心思路:性能监控不是看一个指标就下结论。要像医生看病一样,望闻问切,综合判断。
嗯,这三个命令先讲到这里。下一节我们会继续深入,看看怎么用 dumpsys 监控网络、显示、电源管理等更多信息。不过那是下节课的事了,先把今天这三个练熟再说。