統(tǒng)計設備耗電數(shù)據(jù):Battery Historian工具(https://github.com/google/battery-historian)
Battery Historian是一種在設備上電池時檢查Android設備(Android 5.0 Lollipop及更高版本:API Level 21+)上的電池相關信息和事件的工具。它允許應用程序開發(fā)人員在時間線上可視化系統(tǒng)和應用程序級事件,并輕松查看自設備上次完全收費以來的各種聚合統(tǒng)計信息。
一. 使用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環(huán)境 (要配置PATH);
- 接著下載配置Git環(huán)境 (要配置PATH);
配置環(huán)境變量
GIT:D:\prgram\Git\bin
PATH:D:\program\Git\bin
檢查git安裝情況
cmd中輸入git version
- 接著下載配置Python 2.7環(huán)境 (要配置PATH,不能是3.7版本);
配置環(huán)境變量
PATH:D:\program\python2.7.12
檢查python安裝情況
cmd中輸入python可以進入python環(huán)境
- 接著下載配置Go環(huán)境 (要配置PATH和GOPATH以及GOBIN);
新建Go項目路徑:GoProject
配置環(huán)境變量
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的環(huán)境變量。
Python環(huán)境需要是2.7的(3.x不行), 建議使用pyenv管理本地的python環(huán)境。
另外,因為Battery Historian是一個網(wǎng)頁版工具,,涉及一些JS引用,有時需要翻墻。
- 前面的配置其實很快就能完成,接下來就是下載Battery Historian的源碼來進行編譯了;
$ go get -d -u github.com/google/battery-historian/…
下載完成之后,代碼會下載到配置的GOPATH中,可以去檢查下;
$ cd $GOPATH/src/github.com/google/battery-historian
切換到那個目錄,然后執(zhí)行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),如果沒有均手動創(chuàng)建。
注意:這一步編譯命令若是沒成功,需要注意:C:\Users\Administrator\src\github.com\google\battery-historian\compiled,文件夾下的文件有沒有成功下載:historian-optimized.js (不可少)
上面的步驟都完成之后就可以啟動 Battery Historian了,默認端口是9999(注意還是在剛剛目錄下執(zhí)行)。
$ 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出電量使用統(tǒng)計信息。
- 因為電量統(tǒng)計數(shù)據(jù)是持續(xù)的,會非常大, 統(tǒng)計我們的待測試 App 之前先 reset 下, 連上設備,命令行執(zhí)行:
初始化android電池電量數(shù)據(jù)
$ adb shell dumpsys batterystats --enable full-wake-history
$ adb shell dumpsys batterystats --reset
Battery stats reset.
- 斷開測試設備, 操作我們的待測試App;
- 重新連接設備, 使用adb命令導出相關統(tǒng)計數(shù)據(jù):
$ adb shell dumpsys batterystats > xxx.txt //得到整個設備的電量消耗信息
$ adb shell dumpsys batterystats > com.package.name > xxx.txt //得到指定app相關的電量消耗信息
或
// 此命令持續(xù)記錄輸出, 想要停止記錄時按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),下面是它的輸出結果打開(圖形化展示電池的消耗情況)。

在頁面的下方我們可以查看這段時間內系統(tǒng)的狀態(tài)system stats,也可以選擇某個應用查看應用的狀態(tài)app stats:

其中我們可以看到 Device estimated power use 中顯示了估算的應用耗電量值為0.14%。

3. 報表中各參數(shù)的意義
重要的參數(shù):WiFi、wake_lock、conn、mobile_ratio(蜂窩信號)
-
battery_level
電量,可以看出電量的變化。比如圖中的數(shù)據(jù)顯示剛開始電量是100%,然后在第11秒-12秒中間的某個時刻降到了99%。
plugged
充電狀態(tài),這一欄顯示是否進行了充電,以及充電的時間范圍。例如上圖反映了我們在第22s插入了數(shù)據(jù)線,然后一直持續(xù)了數(shù)據(jù)采集結束。screen
屏幕是否點亮,這一點可以考慮到睡眠狀態(tài)和點亮狀態(tài)下電量的使用信息。top
該欄顯示當前時刻哪個app處于最上層,就是當前手機運行的app,用來判斷某個app對手機電量的影響,這樣也能判斷出該app的耗電量信息。該欄記錄了應用在某一個時刻啟動,以及運行的時間,這對我們比對不同應用對性能的影響有很大的幫助。wake_lock*
wake_lock 該屬性是記錄wake_lock模塊的工作時間。是否有停止的時候等。running
界面的狀態(tài),主要判斷是否處于idle的狀態(tài)。用來判斷無操作狀態(tài)下電量的消耗。wake_lock_in*
wake_lock有不同的組件,這個地方記錄在某一個時刻,有哪些部件開始工作,以及工作的時間。Sync
是否跟后臺同步。
可以把鼠標停在某一項上面。可以看到何時sync同步 啟動的,持續(xù)時間Duration多久。電池容量不會顯示單一行為消耗的具體電量,這里只能顯示使用電池的頻率和時長,你可以看分時段的剩余電量來了解具體消耗了多少電量。APP selection
可查看某個應用的數(shù)據(jù),如UID、CPU使用情況、相機調起次數(shù)等。
4. bugreport相關推薦
關于bugreport相關的知識推薦閱讀Android adb bugreport工具分析和使用這篇文章,作者簡單地從源碼角度分析了adb bugreport命令的運行原理,結論是bugreport其實是啟動了dumpstate service來輸出數(shù)據(jù),其中數(shù)據(jù)來源包括:
1.系統(tǒng)屬性
2./proc和/sys節(jié)點文件
3.執(zhí)行shell命令獲得相關輸出
4.logcat輸出
5.Android Framework Services信息基本使用dumpsys命令通過binder調用服務中的dump函數(shù)獲得信息
下面是其他的幾篇關于battery-historian使用的文章可供參考:
(1) Android性能專項測試之battery-historian使用
(2) Android性能專項測試之Batterystats
(3) Battery Historian 2.0 for windows環(huán)境搭建
(4) Android應用耗電量分析與優(yōu)化建議
(5)使用Battery Historian分析電源使用情況
5. 關于電量方面的Android性能優(yōu)化
電量方面的性能優(yōu)化可以參考:
性能優(yōu)化典范中的Android性能優(yōu)化之電量篇
Android App 優(yōu)化之持久電量
Android性能優(yōu)化-電量優(yōu)化
Android后臺調度任務與省電
(1)為了減少電量的消耗,在蜂窩移動網(wǎng)絡下,最好做到批量執(zhí)行網(wǎng)絡請求,盡量避免頻繁的間隔網(wǎng)絡請求
(2)使用Job Scheduler,應用需要做的事情就是判斷哪些任務是不緊急的,可以交給Job Scheduler來處理,Job Scheduler集中處理收到的任務,選擇合適的時間,合適的網(wǎng)絡,再一起執(zhí)行
