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 快速查看时间线 毫秒级 ★★☆☆☆

最后说一句:没有万能工具,只有合适的场景。我个人的工作流是这样的:

  1. 用户反馈耗电 → 先跑 BatteryStats 看个大概
  2. 发现异常唤醒 → 用 dumpsys batterystats 深挖
  3. 需要系统级分析 → 上 Perfetto
  4. 怀疑 CPU 问题 → Simpleperf 伺候

这套组合拳打下来,90% 的功耗问题都能定位到根因。剩下的 10%,嗯...那就要靠经验了,咱们后面的章节再聊。