Android battery historian功耗分析之環(huán)境搭建

凡事謙虛胎围、溫柔欲低、忍耐米者、用愛心互相寬容韭畸,用平和彼此聯(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)告执虹。

報(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ù)加勤。


historian 示意圖

對(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)。


細(xì)節(jié)圖

這里的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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末码荔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子感挥,更是在濱河造成了極大的恐慌缩搅,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件触幼,死亡現(xiàn)場離奇詭異硼瓣,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)置谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門堂鲤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霉祸,你說我怎么就攤上這事筑累。” “怎么了丝蹭?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵慢宗,是天一觀的道長。 經(jīng)常有香客問我奔穿,道長镜沽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任贱田,我火速辦了婚禮缅茉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘男摧。我一直安慰自己蔬墩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布耗拓。 她就那樣靜靜地躺著拇颅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪乔询。 梳的紋絲不亂的頭發(fā)上樟插,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼黄锤。 笑死搪缨,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的鸵熟。 我是一名探鬼主播副编,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼旅赢!你這毒婦竟也來了齿桃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤煮盼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后带污,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體僵控,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年鱼冀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了报破。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡千绪,死狀恐怖充易,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情荸型,我是刑警寧澤盹靴,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站瑞妇,受9級(jí)特大地震影響稿静,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜辕狰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一改备、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔓倍,春花似錦悬钳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倒堕,卻和暖如春灾测,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國打工媳搪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铭段,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓秦爆,卻偏偏與公主長得像序愚,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子等限,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容