4、软件功耗分析工具链:BatteryStats、dumpsys batterystats、batterystats bugreport、Perfetto、Simpleperf、systrace等工具的使用与对比
做功耗分析这些年,我最大的感触就是:工具不在多,在于会用。很多新人一上来就追着问「哪个工具最牛」,其实每个工具都有自己的脾气秉性。今天我就把这几个常用的工具掰开揉碎了讲讲,顺便聊聊我踩过的坑。
4.1 BatteryStats:系统自带的「电表」
BatteryStats 是 Android 系统内置的功耗统计模块。说白了,它就是个记账本——记录每个应用、每个硬件模块花了多少电。
核心能力:统计各应用 CPU 唤醒时间、网络流量、传感器使用时长等。
我个人习惯先用这个工具做快速排查。比如用户反馈手机待机耗电快,我第一件事就是跑一下 BatteryStats 看看有没有异常唤醒。
常用命令:
# 重置统计信息
adb shell dumpsys batterystats --reset
# 等待一段时间后导出报告
adb shell dumpsys batterystats > battery_stats.txt
嗯,这里要注意:重置后至少要等 30 分钟,数据才有参考价值。我曾经有一次只等了 5 分钟就导出数据,结果全是噪声,白忙活半天。
4.2 dumpsys batterystats:更精细的「电表读数」
BatteryStats 是原始数据,而 dumpsys batterystats 是它的「可视化报表」。它能告诉你每个应用的详细耗电构成。
关键参数:
| 参数 | 作用 | 我的经验 |
|---|---|---|
| --checkin | 输出机器可解析格式 | 适合自动化脚本处理 |
| --history | 显示历史时间线 | 排查突发耗电时必用 |
| --wakeup | 只显示唤醒锁信息 | 定位「睡死」问题首选 |
举个例子,我曾经遇到一个第三方 App 在后台疯狂持锁。用 dumpsys batterystats --wakeup 一看,好家伙,一个唤醒锁持了 3 个小时。这就是典型的「流氓应用」行为。
4.3 batterystats bugreport:一键生成「体检报告」
这个工具我把它叫做「傻瓜式体检」。你只需要跑一条命令,它就把系统所有信息打包成一个 zip 文件。
adb bugreport bugreport.zip
解压后你会看到一个 bugreport-xxx.html 文件。里面包含了 BatteryStats 的所有数据,还有 CPU、内存、网络等综合信息。
我的小技巧:用 Chrome 打开这个 HTML 文件,按 Ctrl+F 搜索 "Battery History",可以直接定位到耗电时间线。比手动翻日志快多了。
不过要提醒你:bugreport 数据量很大,一次抓取可能产生几十 MB 的日志。我建议只在问题复现后立即抓取,不要长时间运行。
4.4 Perfetto:现代版的「示波器」
Perfetto 是 Google 主推的新一代性能分析工具。它把 CPU、GPU、内存、调度等信息整合到一个时间轴上,可视化程度非常高。
为什么我推荐它?
- 支持 Android 10 及以上版本
- 可以自定义 trace 事件
- Web UI 交互非常流畅
基本用法:
# 抓取 10 秒的 trace
adb shell perfetto -o /data/misc/perfetto-traces/trace.perfetto-trace \
-t 10s \
sched freq idle am wm gfx view
# 拉取到电脑
adb pull /data/misc/perfetto-traces/trace.perfetto-trace .
然后打开 https://ui.perfetto.dev 加载这个文件。你想想看,所有线程的调度情况、CPU 频率变化、唤醒锁的持有时间,全都一目了然。
注意:Perfetto 抓取期间手机会明显发热,这是正常的。但不要抓取超过 30 秒,否则数据量太大,UI 会卡死。我曾经贪心抓了 2 分钟,结果浏览器直接崩溃了...
4.5 Simpleperf:CPU 热点「显微镜」
Simpleperf 是 Android NDK 自带的 CPU 性能分析工具。它跟 Linux 的 perf 工具类似,但针对 Android 做了优化。
什么时候用它?
- 怀疑某个函数 CPU 占用过高
- 需要分析 native 代码性能
- 定位帧率掉帧的根因
实战命令:
# 采样 10 秒
adb shell simpleperf record -p $(pidof com.example.app) \
-e cpu-cycles:u -f 4000 -o /data/local/tmp/perf.data \
--duration 10
# 生成报告
adb shell simpleperf report -i /data/local/tmp/perf.data \
--sort comm,dso,symbol > perf_report.txt
我记得有一次做游戏功耗优化,发现 CPU 占用率居高不下。用 Simpleperf 一分析,发现是某个纹理压缩函数被频繁调用。优化后功耗直接降了 15%。
4.6 systrace:老牌「时间线」工具
systrace 虽然已经被 Perfetto 取代,但很多老项目还在用。它的优势在于:轻量、快速、兼容性好。
基本命令:
python systrace.py -t 10 -o trace.html \
sched freq idle gfx view wm am
生成的 HTML 文件可以直接在浏览器打开。你会看到类似这样的时间线:
- 绿色条:CPU 运行状态
- 蓝色条:SurfaceFlinger 合成
- 黄色条:应用主线程
对比总结:systrace 适合快速看个大概,Perfetto 适合深度分析。我现在的习惯是:先用 systrace 扫一眼,发现问题再用 Perfetto 深挖。
4.7 工具对比:什么时候用哪个?
| 工具 | 适用场景 | 数据粒度 | 上手难度 |
|---|---|---|---|
| BatteryStats | 快速排查应用耗电 | 分钟级 | ★☆☆☆☆ |
| dumpsys batterystats | 详细分析唤醒锁 | 秒级 | ★★☆☆☆ |
| batterystats bugreport | 一键生成综合报告 | 分钟级 | ★☆☆☆☆ |
| Perfetto | 深度分析系统行为 | 毫秒级 | ★★★★☆ |
| Simpleperf | CPU 热点定位 | 微秒级 | ★★★☆☆ |
| systrace | 快速查看时间线 | 毫秒级 | ★★☆☆☆ |
最后说一句:没有万能工具,只有合适的场景。我个人的工作流是这样的:
- 用户反馈耗电 → 先跑 BatteryStats 看个大概
- 发现异常唤醒 → 用 dumpsys batterystats 深挖
- 需要系统级分析 → 上 Perfetto
- 怀疑 CPU 问题 → Simpleperf 伺候
这套组合拳打下来,90% 的功耗问题都能定位到根因。剩下的 10%,嗯...那就要靠经验了,咱们后面的章节再聊。