凡事謙虛胎围、溫柔欲低、忍耐米者、用愛心互相寬容韭畸,用平和彼此聯(lián)絡(luò),竭力保守圣靈所賜合而為一的心塘雳。----以弗所書4:2-3
battery historian 是什么
battery historian是用go語言開發(fā)的一個(gè)電池耗電分析工具陆盘,Android 5.0以后的版本可以使用它。其官方文檔地址https://github.com/google/battery-historian败明。
環(huán)境配置
安裝Go語言
從go官網(wǎng)http://golang.org/doc/install 下載安裝 。沒找到國內(nèi)鏡像太防,漫長的下載過程妻顶。mac版本下載pkg包后點(diǎn)擊安裝酸员,此后go已經(jīng)安裝好了,為了使用方便還需要配置下環(huán)境變量讳嘱。
$ cd mydisk # 進(jìn)入任意目錄
$ mkdir -p go-workspace/bin # go編譯后的執(zhí)行文件會(huì)放在該目錄下
$ mkdir -p go-workspace/src # 放置go語言編寫的項(xiàng)目的源碼
#以后的項(xiàng)目結(jié)構(gòu)大概如下圖
#bin/
# testA # 可執(zhí)行命令
# testB # 可執(zhí)行命令
#src/
# projectA #A工程文件
# projectB #B工程文件
#為了不用每次配置go的環(huán)境變量幔嗦,將下面內(nèi)容添加到.bashrc文件中
export GOPATH=mydisk/go-workspace
export GOBIN=$GOPATH/bin
export PATH=$PATH:$GOBIN
下載配置battery historian
go get -d -u github.com/google/battery-historian/...
...要帶上,這樣才會(huì)將相關(guān)的依賴也同步下載下來沥潭。等待運(yùn)行完成后邀泉,去$GOPATH/src下看到github.com目錄,battery-historian就放在其下钝鸽。
$ cd go-workspace/src/github.com/google/battery-historian
$ go run setup.go #漫長的等待汇恤,它需要聯(lián)網(wǎng)下載以來庫,編譯Javascript等拔恰。
如果你所在地區(qū)被墻的厲害因谎,可能只能看著Downloading Closure library...
干著急。去setup.go文件搜索Closure颜懊,原來一直在龜速下載
http://dl.google.com/closure-compiler/compiler-20160208.zip财岔。這時(shí)可以手動(dòng)下載該包,解壓到src/github.com/google/battery-historian/third_party/closure-library
河爹。然后在去運(yùn)行go run setup.go
啟動(dòng)battery historian服務(wù)器
$ cd $GOPATH/src/github.com/google/battery-historian
$ go run cmd/battery-historian/battery-historian.go
必須要在$GOPATH/src/github.com/google/battery-historian directory目錄下運(yùn)行匠璧。
然后在瀏覽器中打開http://localhost:9999。就可以上傳bugreport.txt進(jìn)行分析了咸这。
分析battery historian
獲取bugreport
Android 6.0之前:
$ adb bugreport > bugreport.txt
Android 6.0之后:
$ adb bugreportz
# 根據(jù)提示adb pull出生成的壓縮文件夷恍,然后解壓
# 某些手機(jī)上也可以使用舊的命令,執(zhí)行完成后會(huì)生成一個(gè)壓縮包和bugreport.txt炊苫,上傳壓縮包也能解析裁厅。
$ adb bugreport > bugreport.txt
分析報(bào)告示例
瀏覽器中打開http://localhost:9999。上傳bugreport.txt進(jìn)行分析侨艾。下圖為上傳后生成的報(bào)告执虹。
半離線使用historian.py
historian.py是battery historian工具包下的一個(gè)腳本,它用來解析battery stats唠梨。
在分析前袋励,先用命令
adb shell dumpsys batterystats --reset
清除測試前的電量數(shù)據(jù),保證測試環(huán)境的干凈当叭,避免舊的臟數(shù)據(jù)影響茬故。
如果要詳細(xì)的分析wakelock事件,執(zhí)行如下命令
adb shell dumpsys batterystats --enable full-wake-history
如果還要分析更加詳細(xì)的kernel層wakelock蚁鳖,則需要root手機(jī)磺芭,按如下操作。
$ adb shell
# 設(shè)置trace事件
$ echo "power:wakeup_source_activate" >> /d/tracing/set_event
$ echo "power:wakeup_source_deactivate" >> /d/tracing/set_event
# 設(shè)置一個(gè)8m的trace空間醉箕,防止trace空間溢出钾腺,抓取的log被沖掉
$ echo 8192 > /d/tracing/buffer_size_kb
$ echo 1 > /d/tracing/tracing_on
然后斷開usb連接徙垫,避免連接usb線充電的干擾。此后愉快的玩耍手機(jī)放棒,復(fù)現(xiàn)耗電問題姻报。
一小段時(shí)間后,執(zhí)行
adb shell dumpsys batterystats > batterystats.txt
收集測試期間的電量數(shù)據(jù)间螟,該數(shù)據(jù)被保存在batterystats.txt文件中吴旋。
這個(gè)時(shí)候就該historian.py出場了。如果你是clone的battery historian包厢破,那么該腳本位于scripts/historian.py下荣瑟。執(zhí)行命令
python historian.py batterystats.txt > batterystats.html
用chrome打開轉(zhuǎn)換生成的batterystats.html文件,注意這個(gè)時(shí)候保持電腦連網(wǎng)溉奕,只要打開過一次瀏覽器加載了需要的js后面就可以不用在連線了褂傀。之所以叫半離線使用就在這。得到如下圖的數(shù)據(jù)加勤。
對(duì)照上圖解釋下各項(xiàng)數(shù)據(jù)的含義仙辟。按行分析圖表,圖表中的數(shù)據(jù)不代表該項(xiàng)的耗電量鳄梅,被著色只是表示該項(xiàng)處于激活狀態(tài)叠国,它確實(shí)在耗電,但具體耗了多少電戴尸,圖表是量化不出來的粟焊,只能定性的分析它耗電了。另外圖表中耗電數(shù)據(jù)的呈現(xiàn)方式也不是按進(jìn)程來組織的孙蒙,而是按照耗電組件的方式排布项棠,比如著大紅色top行表示當(dāng)前運(yùn)行在前臺(tái)的進(jìn)程,切換前臺(tái)進(jìn)程挎峦,不管當(dāng)前前臺(tái)是哪個(gè)應(yīng)用都始終被歸類在top行里香追。
在上一張官方的圖例說明。
對(duì)照官方圖例介紹下各行的含義坦胶。
- battery_level: 開始測試時(shí)的電量透典,之前抓取的圖可以看到電量是100,滿電狀態(tài)顿苇。
- top: 前臺(tái)應(yīng)用峭咒,如果要分析應(yīng)用的耗電情況,那么在測試期間纪岁,就該保證應(yīng)用一直處于前臺(tái)凑队。
- wifi_running: wifi連接情況下的耗電情況,我抓取時(shí)沒開wifi幔翰,因此沒有看到該項(xiàng)顽决。
- screen: 亮屏狀態(tài)短条,可以看到圖表中該項(xiàng)著色有間隔导匣,這是因?yàn)閷?shí)驗(yàn)期間我關(guān)閉過屏幕才菠,每關(guān)閉一次屏幕,著色就被打斷贡定。
- phone_in_call: 記錄打電話的耗電狀況赋访。
- wake_lock: 應(yīng)用被喚醒,該項(xiàng)數(shù)據(jù)非常有意義缓待,頻繁喚醒應(yīng)用是高耗電的前兆蚓耽,如果該項(xiàng)看到眾多色塊,往往需要重點(diǎn)去check旋炒。
- running: cpu在運(yùn)行步悠,同樣表明在耗電。
- wake_reason: 被喚醒的原因瘫镇,去代碼看該次喚醒是否有必要鼎兽,是否能將多個(gè)任務(wù)集中在一起,喚醒一次去執(zhí)行铣除。
mobile_radio: BP側(cè)耗電谚咬,通常是指SIM卡,數(shù)據(jù)鏈接尚粘。該欄過多著色择卦,間隔多。表示功耗也會(huì)高郎嫁。
在細(xì)說下一點(diǎn)秉继。有時(shí)數(shù)據(jù)量大,很多色被擠壓在一起不太方便觀察泽铛,此時(shí)可以用放大功能尚辑,類似systrace工具中的w鍵,但該工具做的沒systrace便利厚宰,還需要手動(dòng)填寫縮放比例腌巾,具體下圖我放大了1000.
放大后看看top項(xiàng)。
這里的u0a99代表的是進(jìn)程id铲觉,某些手機(jī)能直接顯示出進(jìn)程名澈蝙,如果廠商該ROM,可能導(dǎo)致進(jìn)程名無法顯示出來撵幽,這時(shí)可以去ps進(jìn)程id灯荧,方向查到對(duì)應(yīng)的包名。如果看的細(xì)心點(diǎn)還可以發(fā)現(xiàn)u0a99之后出現(xiàn)了u0a114盐杂,這個(gè)是因?yàn)閷?shí)驗(yàn)時(shí)我切換了前臺(tái)應(yīng)用逗载,可以看到這個(gè)動(dòng)作很精確的被historian捕捉到了哆窿。
電量監(jiān)控分析
從官方文檔看該工具還能進(jìn)行電量監(jiān)控,但依賴源碼的某些文件厉斟。暫時(shí)還未完全配置好挚躯,先挖個(gè)坑,以后回填擦秽。
monsoon.py 使用前需要安裝
- gflags
$ git clone https://github.com/google/python-gflags.git
$ cd python-gflags
$ sudo python setup.py install
- pyserial
$ git clone https://github.com/pyserial/pyserial.git
$ cd pyserial
$ sudo python setup.py install