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 知识体系总览

这三个命令虽然各自独立,但组合起来就能全面了解设备的性能状态。我画了一张图帮你理清关系:

性能监控三件套 CPU 信息 dumpsys cpuinfo 内存信息 dumpsys meminfo 电池信息 dumpsys battery 查看内容 • 系统负载 • 进程 CPU 占比 • 用户态/内核态 查看内容 • Pss / Private Dirty • Native / Dalvik Heap • 各 mmap 区域 查看内容 • 电量百分比 • 充电状态 • 温度 / 电压 组合使用 → 全面掌握设备性能状态

15.5 实战组合拳

光看单个命令还不够,我一般会这样组合使用:

  1. 先看电池dumpsys battery 确认设备状态正常,温度不高。
  2. 再看 CPUdumpsys cpuinfo 看看有没有异常进程在吃 CPU。
  3. 最后看内存dumpsys meminfo 针对目标 App 做详细分析。

举个例子。有一次用户反馈 App 在后台耗电严重。我连上设备,先看电池温度,38度,偏高。再看 CPU,发现一个后台服务 CPU 占用 40%。最后看内存,发现这个服务里有个 HashMap 一直在增长,明显是泄漏了。修复后,耗电问题直接解决。

核心思路:性能监控不是看一个指标就下结论。要像医生看病一样,望闻问切,综合判断。

嗯,这三个命令先讲到这里。下一节我们会继续深入,看看怎么用 dumpsys 监控网络、显示、电源管理等更多信息。不过那是下节课的事了,先把今天这三个练熟再说。

公众号:蓝海资料掘金营,微信deep3321