1. 程式人生 > >android電量優化之Battery Historian工具使用

android電量優化之Battery Historian工具使用

前幾天寫了關於androidAPP效能優化總結的文章,還沒有看的話可以看一下,這文章提到了電量優化,android耗電分析所用到的工具battery-historian,這裡做一個總結.

在 Android5.0 以前,在應用中測試電量消耗比較麻煩,也不準確,5.0 之後專門引入了一個獲取裝置上電量消耗資訊的 API:Battery Historian。Battery Historian 是一款由 Google 提供的 Android 系統電量分析工具,是一款圖形化資料分析工具,直觀地展示出手機的電量消耗過程,通過輸入電量分析檔案,顯示消耗情況,最後提供一些可供參考電量優化的方法。

資料準備

battery-historian工具需要使用bugreport中的Battery History 
* 1.先斷開adb服務,然後開啟adb服務 
adb kill-server 這一步很重要,因為當我們開發時做電量記錄時會開啟很多可能造成衝突的東西。為了保險起見我們重啟adb。 
adb devices就會自動連線查詢手機。當然也可以adb start-server 
* 2.重置電池資料收集資料,我們在開始的時候需要通過以下命令來開啟電池資料的獲取以及重置:

      adbshelldumpsysbatterystats--enable full-wake-history

      adbshelldumpsysbatterystats--reset
1
2
3
執行的效果如下: 
上面的操作相當於初始化操作,如果不這麼做會有一大堆的干擾的資料,看起來會比較痛苦。然後把資料線直接拔掉(防止資料線造成充放電資料干擾),現在做一些[測試],手動或者跑一些自動化的case都行。經過一段時間後,我們重新連線手機確認adb連上了,執行下面這條命令來將bugreport的資訊儲存到txt文件中,

 adb bugreport> bugreport.txt
1
或者用下面的命令也可以:

adb shell dumpsysbatterystats> batterystats.txt 
adb shell dumpsysbatterystats>com.example.android.sunshine.app> batterystats.txt

加上包名可以限制輸出的資料是我們要檢測的。 
但是這個txt的資料可讀性不強。接下來我們就要用到這個battery-historian工具了。

到此我們有兩種方式分析這個檔案:(historian-V1之前的版本和historian-V2最新的版本)

historian-V1之前的版本分析方式:

將txt文件轉化為html檔案,命令如下。

  python historian.py -a bugreport.txt> battery.html
1
上面的historian.py指令碼是Python寫的,所以需要python環境,然後從github上下載這個指令碼。檔案在github上面的scripts目錄下面,需要下載到命令列所在的目錄 


上面兩條命令執行成功後,會在目錄下發現兩個檔案 
bugreport.txt和battery.html,這個時候我們用google瀏覽器開啟html檔案,可以看到如下資訊: 


各個引數的意義

首先我們在bugreport.txt找到Battery History資料欄類似下面的資訊:

      -------------------------------------------------------------------------------

      DUMPOFSERVICEbatterystats:

      BatteryHistory (2% used, 5980 used of256KB, 45 strings using 2592):

      0 (9) RESET:TIME: 2015-03-05-15-21-56

      0 (2) 100 c0900422 status=discharging health=good plug=none temp=200       volt=4167 +running +wake_lock +sensor +screen data_conn=edge phone_signal_strength=great brightness=medium proc=u0a15:"android.process.acore"

      0 (2) 100 c0900422 proc=u0a7:"com.android.cellbroadcastreceiver"

      0 (2) 100 c0900422 proc=u0a53:"com.android.gallery3d"
1
2
3
4
5
6
7
8
9
10
11
12
13
你在html中資訊都能從bugreport.txt中找到相應的資訊。

現在來分析各個指標代表的意義: 
* 橫座標 


上面的10,20代表的就是秒的意思,它是以一分鐘為週期,到第60秒的時候變為0。橫座標就是一個時間範圍,咱們的例子中統計的資料是以重置為起點,獲取bugreport內容時刻為終點。我們一共採集了多長時間的資料,圖表下也有資訊說明。(經其他人的反饋,這個座標間隔是會隨著時間的長度發生改變,所以要以你的實際情況為準。這個縮放級別可以調整的,如下圖:)

 
* 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有不同的元件,這個地方記錄在某一個時刻,有哪些部件開始工作,以及工作的時間。
gps 
gps是否開啟
phone_in_call 
是否進行通話
Sync 
是否跟後臺同步. 
可以把滑鼠停在某一項上面。可以看到何時sync同步啟動的,持續時間Duration多久。電池容量不會顯示單一行為消耗的具體電量,這裡只能顯示使用電池的頻率和時長,你可以看分時段的剩餘電量來了解具體消耗了多少電量。 

Job 
後臺的工作,比如服務service的執行。從下面圖中可以看到qihoo的AppStore和魯大師都在執行後臺服務。 

data_conn 
資料連線方式的改變,上面的edge是說明採用的gprs的方式連線網路的。此資料可以看出手機是使用2g,3g,4g還是wifi進行資料交換的。這一欄可以看出不同的連線方式對電量使用的影響。
status 
電池狀態資訊,有充電,放電,未充電,已充滿,未知等不同狀態。 
這一欄記錄了電池狀態的改變資訊。
phone_signal_strength 
手機訊號狀態的改變。 
這一欄記錄手機訊號的強弱變化圖,依次來判斷手機訊號對電量的影響。
health 
電池健康狀態的資訊,這個資訊一定程度上反映了這塊電池使用了多長時間。 
這一欄記錄電池狀態在何時發生改變,上面的圖中電池狀態一直處於good狀態。
plug 
充電方式,usb或者插座,以及顯示連線的時間。 
這一欄顯示了不同的充電方式對電量使用的影響。
historian-V2最新的版本的方式:

將生成bugreport.txt檔案在 http://localhost:9999 中上傳檔案生成報告(前提在本地或者某伺服器上搭好了battery-historian專案環境)

其實在這裡也可以看到兩種版本分析模式:

好了,battery-historian分析工具就寫到這裡,大家有興趣的話可以去試試!

本人做android開發多年,以後會陸續更新關於android高階UI,NDK開發,效能優化等文章,更多請關注我的微信公眾號:謝謝!