12、Battery Historian:Battery Historian工具介绍、如何抓取bugreport、分析电量消耗

做Android系统开发这些年,我遇到过不少用户抱怨手机耗电快的案例。有的说待机一晚上掉电20%,有的说看个视频手机能煎鸡蛋。说实话,很多问题光靠猜是没用的。你得有数据,得有工具。

Battery Historian就是Google官方给咱们准备的一把利器。它能把系统里那些乱七八糟的电量日志,变成一张张直观的图表。你一眼就能看出,到底是哪个App在后台偷偷干活,还是哪个硬件模块没睡好觉。

12.1 Battery Historian是什么?

说白了,Battery Historian是一个基于Web的分析工具。它读取的是Android系统生成的bugreport文件,然后解析里面的电量统计信息,用时间轴的方式展示出来。

我个人习惯把它叫做「电量侦探」。为什么?因为它能帮你找到那些隐藏的耗电元凶。比如某个App每隔几分钟就唤醒一次系统,或者Wi-Fi模块一直没进入休眠状态。

核心价值:把枯燥的日志数据变成可视化的时间轴,让电量消耗一目了然。

Battery Historian支持两种模式:一个是本地模式(用Python启动Web服务),另一个是Docker模式。我建议新手直接用Docker,省去环境配置的麻烦。

12.2 如何抓取bugreport?

抓bugreport是分析电量消耗的第一步。嗯,这里要注意,抓取的时机和方法直接影响分析结果。

我一般分三步走:

  1. 重置电量统计 - 确保数据从零开始
  2. 复现问题场景 - 让耗电问题暴露出来
  3. 导出bugreport - 抓取完整日志

12.2.1 重置电量统计

在开始测试之前,先清空历史数据。这样后面抓到的数据才干净。

# 重置电池统计数据
adb shell dumpsys batterystats --reset

# 确认重置成功
adb shell dumpsys batterystats | grep "Statistics since"

我曾经犯过一个错误:没重置就直接抓数据,结果分析了一堆历史记录,浪费了大半天时间。所以这个步骤千万别省。

12.2.2 复现问题场景

重置之后,让手机正常使用一段时间。比如你要分析待机耗电,就把手机放那不动,等个4-6小时。如果是看视频耗电,就播放半小时视频。

我个人建议至少收集2小时以上的数据。太短的数据看不出规律,太长又没必要。2-4小时是个比较合适的窗口。

12.2.3 导出bugreport

复现完成后,马上抓取bugreport:

# 抓取完整bugreport
adb bugreport bugreport_$(date +%Y%m%d_%H%M%S).zip

这个命令会生成一个zip文件,里面包含了dumpsys、logcat、内核日志等所有信息。Battery Historian主要用的是里面的batterystats数据。

小技巧:抓取时确保手机USB连接稳定。我遇到过抓取到一半断连的情况,结果文件损坏,又得重来。

12.3 分析电量消耗

拿到bugreport之后,就可以用Battery Historian分析了。我习惯用Docker方式启动:

# 拉取镜像
docker pull gcr.io/android-battery-historian/stable:3.0

# 启动服务
docker run -p 9999:9999 gcr.io/android-battery-historian/stable:3.0

然后在浏览器打开 http://localhost:9999,上传刚才抓到的bugreport文件。

12.3.1 时间轴概览

上传之后,你会看到一张密密麻麻的时间轴图。别慌,咱们先看几个关键指标:

指标 含义 重点关注
Screen 屏幕开关状态 灭屏后是否还有异常唤醒
Top App 前台运行的App 是否频繁切换
Wake Lock 唤醒锁持有情况 是否有App长时间持有不释放
Wifi Wi-Fi连接状态 灭屏后是否持续扫描
Mobile Radio 移动网络状态 信号弱时是否频繁切换

你想想看,如果屏幕关了,但Wake Lock那一栏还有大片的蓝色块,说明有App在后台锁着系统不让睡。这就是典型的耗电问题。

12.3.2 系统状态分析

Battery Historian会把系统状态分成几个层级。我最常用的是「System Stats」面板,里面能看到:

  • Total running time - 总运行时间
  • Screen on time - 亮屏时间
  • Kernel overheat time - 内核过热时间
  • Total Wakelock time - 总唤醒锁时间

我记得有一次分析一个项目,发现Total Wakelock time占了总运行时间的60%。这明显不正常。后来顺着时间轴一查,发现是一个第三方SDK在后台轮询位置信息。

注意:不要只看总时间,要看「每小时的唤醒次数」。有些App虽然每次唤醒时间短,但频率极高,累积起来也很耗电。

12.3.3 App级别耗电分析

往下翻,你会看到「App Stats」部分。这里列出了每个App的耗电详情:

App Name: com.example.someapp
  Wakelock time: 12m 34s
  CPU time: 8m 21s
  Network usage: 45MB
  Number of wakeups: 127

重点关注三个数字:

  1. Wakelock time - 这个App让系统保持清醒的时间
  2. Number of wakeups - 唤醒系统的次数
  3. Network usage - 后台网络流量

如果某个App的唤醒次数超过100次/小时,基本可以判定它有问题。我曾经遇到过一个天气App,每小时唤醒系统300多次,就为了刷新天气数据。你说这合理吗?

12.3.4 找出异常耗电模式

分析的时候,我习惯用「排除法」:

  • 先看系统级耗电(屏幕、Wi-Fi、信号)
  • 再看App级耗电(唤醒锁、CPU、网络)
  • 最后看具体的时间段(夜间待机、使用高峰期)

举个例子,如果夜间待机时,Mobile Radio一直处于高功率状态,那可能是信号不好导致手机频繁搜网。这种问题光靠优化App是没用的,得从射频层面解决。

我的经验:80%的耗电问题都出在「不该醒的时候醒了」。Battery Historian就是帮你找到这些「不该醒」的时刻。

12.4 实战案例:分析待机耗电

最后,我分享一个实际案例。有一次测试发现某款手机待机一晚掉电15%,正常应该在3%以内。

抓取bugreport后,Battery Historian显示:

  • Screen全程关闭(正常)
  • Wake Lock在凌晨2点到5点持续被持有(异常)
  • 持有者是 com.google.android.gms(Google Play服务)
  • 具体原因是 *alarm*:com.google.android.gms.measurement

进一步分析发现,是Google Analytics的测量服务在后台频繁上报数据。解决方案是在待机时限制该服务的网络访问,或者调整上报间隔。

你看,如果没有Battery Historian,你可能得花好几天去猜问题。有了它,半小时就能定位到具体原因。

避坑指南:我曾经因为没看时间轴上的「CPU running」状态,漏掉了一个重要线索。记住,CPU一直在跑,但屏幕是黑的,这本身就是问题。

好了,Battery Historian的基本用法就这些。工具本身不复杂,关键是要养成「用数据说话」的习惯。下次遇到耗电问题,别急着骂App厂商,先抓个bugreport看看。

Battery Historian 分析流程 ① 抓取bugreport adb bugreport xxx.zip ② 导入Battery Historian 上传zip文件 ③ 分析时间轴 查看图表数据 系统状态分析 Screen / WiFi / Radio App级别分析 Wakelock / CPU / 网络 定位耗电元凶 提出优化方案 关键指标:Wake Lock时长 / 唤醒次数 / 后台网络流量 / CPU运行时间
公众号:蓝海资料掘金营,微信deep3321