统计设备耗电数据:Battery Historian工具(https://github.com/google/battery-historian)
Battery Historian是一种在设备上电池时检查Android设备(Android 5.0 Lollipop及更高版本:API Level 21+)上的电池相关信息和事件的工具。它允许应用程序开发人员在时间线上可视化系统和应用程序级事件,并轻松查看自设备上次完全收费以来的各种聚合统计信息。
一. 使用Docker
- 如果是使用Mac或Linux平台的话,推荐直接通过docker运行Battery Historian来完成;
docker -- run -p <port>:9999 gcr.io/android-battery-historian:2.1 --port 9999
之后在浏览器中输入 http://localhost: 就可以查看,然后上传bugreport文件进行分析了。
- 如果是使用Windows平台的话,也可以使用docker,但是机子要在BIOS中开启虚拟化(推荐使用源码编译);
二. 源代码构建(源码编译)
1. battery-historian的安装
- 首先下载配置Java环境 (要配置PATH);
- 接着下载配置Git环境 (要配置PATH);
配置环境变量
GIT:D:\prgram\Git\bin
PATH:D:\program\Git\bin
检查git安装情况
cmd中输入git version
- 接着下载配置Python 2.7环境 (要配置PATH,不能是3.7版本);
配置环境变量
PATH:D:\program\python2.7.12
检查python安装情况
cmd中输入python可以进入python环境
- 接着下载配置Go环境 (要配置PATH和GOPATH以及GOBIN);
新建Go项目路径:GoProject
配置环境变量
GOBIN:D:\program\Go\bin
GOPATH:D:\program\Go\GoProject
GOROOT: D:\program\Go
PATH:%GOBIN%;%GOPATH%
检查Go语言安装情况
cmd中输入go version,查看是否安装成功;
注意:Battery Historian是Go语言的,安装Go的时候需要配置其bin的环境变量。
Python环境需要是2.7的(3.x不行), 建议使用pyenv管理本地的python环境。
另外,因为Battery Historian是一个网页版工具,,涉及一些JS引用,有时需要翻墙。
- 前面的配置其实很快就能完成,接下来就是下载Battery Historian的源码来进行编译了;
$ go get -d -u github.com/google/battery-historian/…
下载完成之后,代码会下载到配置的GOPATH中,可以去检查下;
$ cd $GOPATH/src/github.com/google/battery-historian
切换到那个目录,然后执行setup.go开始编译源码;
go run setup.go
如果下载不成功别担心,可手动下载closure-library、closure-compiler、flot-axislabels,解压放到GOROOT目录下third_party文件夹下方的closure-compiler、closure-library、flot-axislabels文件夹( ../battery-historian\third_party),如果没有均手动创建。
注意:这一步编译命令若是没成功,需要注意:C:\Users\Administrator\src\github.com\google\battery-historian\compiled,文件夹下的文件有没有成功下载:historian-optimized.js (不可少)
上面的步骤都完成之后就可以启动 Battery Historian了,默认端口是9999(注意还是在刚刚目录下执行)。
$ cd $GOPATH/src/github.com/google/battery-historian
$ go run cmd/battery-historian/battery-historian.go [--port <default:9999>]
待控制台输出listening on port:9999
的时候,可以打开浏览器输入 http://localhost:9999 就可以看到。
2. battery-historian的使用:
Android 5.0及以上的设备, 允许我们通过adb命令dump出电量使用统计信息。
- 因为电量统计数据是持续的,会非常大, 统计我们的待测试 App 之前先 reset 下, 连上设备,命令行执行:
初始化android电池电量数据
$ adb shell dumpsys batterystats --enable full-wake-history
$ adb shell dumpsys batterystats --reset
Battery stats reset.
- 断开测试设备, 操作我们的待测试App;
- 重新连接设备, 使用adb命令导出相关统计数据:
$ adb shell dumpsys batterystats > xxx.txt //得到整个设备的电量消耗信息
$ adb shell dumpsys batterystats > com.package.name > xxx.txt //得到指定app相关的电量消耗信息
或
// 此命令持续记录输出, 想要停止记录时按Ctrl+C退出。( Android 6.0及以下版本请使用该导出命令)
$ adb bugreport > bugreport.txt
或
// 将bugreport的信息保存到.zip文件中(Android 7.0及以上版本请使用该导出命令)
$ adb bugreport bugreport.zip
// 通过 historian 图形化展示结果
python historian.py -a bugreport.txt > battery.html
获取到bugreport文件之后,将其上传到Battery Historian上进行分析(http://localhost:9999),下面是它的输出结果打开(图形化展示电池的消耗情况)。
在页面的下方我们可以查看这段时间内系统的状态system stats,也可以选择某个应用查看应用的状态app stats:
其中我们可以看到 Device estimated power use 中显示了估算的应用耗电量值为0.14%。
3. 报表中各参数的意义
重要的参数:WiFi、wake_lock、conn、mobile_ratio(蜂窝信号)
-
battery_level
电量,可以看出电量的变化。比如图中的数据显示刚开始电量是100%,然后在第11秒-12秒中间的某个时刻降到了99%。
plugged
充电状态,这一栏显示是否进行了充电,以及充电的时间范围。例如上图反映了我们在第22s插入了数据线,然后一直持续了数据采集结束。screen
屏幕是否点亮,这一点可以考虑到睡眠状态和点亮状态下电量的使用信息。top
该栏显示当前时刻哪个app处于最上层,就是当前手机运行的app,用来判断某个app对手机电量的影响,这样也能判断出该app的耗电量信息。该栏记录了应用在某一个时刻启动,以及运行的时间,这对我们比对不同应用对性能的影响有很大的帮助。wake_lock*
wake_lock 该属性是记录wake_lock模块的工作时间。是否有停止的时候等。running
界面的状态,主要判断是否处于idle的状态。用来判断无操作状态下电量的消耗。wake_lock_in*
wake_lock有不同的组件,这个地方记录在某一个时刻,有哪些部件开始工作,以及工作的时间。Sync
是否跟后台同步。
可以把鼠标停在某一项上面。可以看到何时sync同步 启动的,持续时间Duration多久。电池容量不会显示单一行为消耗的具体电量,这里只能显示使用电池的频率和时长,你可以看分时段的剩余电量来了解具体消耗了多少电量。APP selection
可查看某个应用的数据,如UID、CPU使用情况、相机调起次数等。
4. bugreport相关推荐
关于bugreport相关的知识推荐阅读Android adb bugreport工具分析和使用这篇文章,作者简单地从源码角度分析了adb bugreport
命令的运行原理,结论是bugreport其实是启动了dumpstate service来输出数据,其中数据来源包括:
1.系统属性
2./proc和/sys节点文件
3.执行shell命令获得相关输出
4.logcat输出
5.Android Framework Services信息基本使用dumpsys命令通过binder调用服务中的dump函数获得信息
下面是其他的几篇关于battery-historian使用的文章可供参考:
(1) Android性能专项测试之battery-historian使用
(2) Android性能专项测试之Batterystats
(3) Battery Historian 2.0 for windows环境搭建
(4) Android应用耗电量分析与优化建议
(5)使用Battery Historian分析电源使用情况
5. 关于电量方面的Android性能优化
电量方面的性能优化可以参考:
性能优化典范中的Android性能优化之电量篇
Android App 优化之持久电量
Android性能优化-电量优化
Android后台调度任务与省电
(1)为了减少电量的消耗,在蜂窝移动网络下,最好做到批量执行网络请求,尽量避免频繁的间隔网络请求
(2)使用Job Scheduler,应用需要做的事情就是判断哪些任务是不紧急的,可以交给Job Scheduler来处理,Job Scheduler集中处理收到的任务,选择合适的时间,合适的网络,再一起执行