Android battery historian功耗分析之環境搭建

凡事謙虛、溫柔、忍耐、用愛心互相寬容,用平和彼此聯絡,竭力保守聖靈所賜合而爲一的心。—-以弗所書4:2-3

battery historian 是什麼

battery historian是用go語言開發的一個電池耗電分析工具,Android 5.0以後的版本可以使用它。其官方文檔地址https://github.com/google/battery-historian

環境配置

安裝Go語言

從go官網http://golang.org/doc/install 下載安裝 。沒找到國內鏡像,漫長的下載過程。mac版本下載pkg包後點擊安裝,此後go已經安裝好了,爲了使用方便還需要配置下環境變量。

$ cd mydisk # 進入任意目錄
$ mkdir -p go-workspace/bin # go編譯後的執行文件會放在該目錄下
$ mkdir -p go-workspace/src # 放置go語言編寫的項目的源碼
#以後的項目結構大概如下圖
#bin/
#    testA  # 可執行命令
#    testB  # 可執行命令
#src/
#    projectA   #A工程文件
#    projectB   #B工程文件

#爲了不用每次配置go的環境變量,將下面內容添加到.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/... 

…要帶上,這樣纔會將相關的依賴也同步下載下來。等待運行完成後,去$GOPATH/src下看到github.com目錄,battery-historian就放在其下。

$ cd go-workspace/src/github.com/google/battery-historian
$ go run setup.go  #漫長的等待,它需要聯網下載以來庫,編譯Javascript等。

如果你所在地區被牆的厲害,可能只能看着Downloading Closure library... 乾着急。去setup.go文件搜索Closure,原來一直在龜速下載
http://dl.google.com/closure-compiler/compiler-20160208.zip。這時可以手動下載該包,解壓到src/github.com/google/battery-historian/third_party/closure-library 。然後在去運行go run setup.go

啓動battery historian服務器

$ cd $GOPATH/src/github.com/google/battery-historian
$ go run cmd/battery-historian/battery-historian.go

必須要在$GOPATH/src/github.com/google/battery-historian directory目錄下運行。
然後在瀏覽器中打開http://localhost:9999。就可以上傳bugreport.txt進行分析了。

分析battery historian

獲取bugreport

Android 6.0之前:

$ adb bugreport > bugreport.txt

Android 6.0之後:

$ adb bugreportz
# 根據提示adb pull出生成的壓縮文件,然後解壓

# 某些手機上也可以使用舊的命令,執行完成後會生成一個壓縮包和bugreport.txt,上傳壓縮包也能解析。
$ adb bugreport > bugreport.txt

分析報告示例

瀏覽器中打開http://localhost:9999。上傳bugreport.txt進行分析。下圖爲上傳後生成的報告。
報告示例

半離線使用historian.py

historian.py是battery historian工具包下的一個腳本,它用來解析battery stats。
在分析前,先用命令

adb shell dumpsys batterystats –reset

清除測試前的電量數據,保證測試環境的乾淨,避免舊的髒數據影響。
如果要詳細的分析wakelock事件,執行如下命令

adb shell dumpsys batterystats –enable full-wake-history

如果還要分析更加詳細的kernel層wakelock,則需要root手機,按如下操作。

$ adb shell
# 設置trace事件
$ echo "power:wakeup_source_activate" >> /d/tracing/set_event
$ echo "power:wakeup_source_deactivate" >> /d/tracing/set_event
# 設置一個8m的trace空間,防止trace空間溢出,抓取的log被沖掉
$ echo 8192 > /d/tracing/buffer_size_kb
$ echo 1 > /d/tracing/tracing_on

然後斷開usb連接,避免連接usb線充電的干擾。此後愉快的玩耍手機,復現耗電問題。
一小段時間後,執行

adb shell dumpsys batterystats > batterystats.txt

收集測試期間的電量數據,該數據被保存在batterystats.txt文件中。
這個時候就該historian.py出場了。如果你是clone的battery historian包,那麼該腳本位於scripts/historian.py下。執行命令

python historian.py batterystats.txt > batterystats.html

用chrome打開轉換生成的batterystats.html文件,注意這個時候保持電腦連網,只要打開過一次瀏覽器加載了需要的js後面就可以不用在連線了。之所以叫半離線使用就在這。得到如下圖的數據。
historian 示意圖

對照上圖解釋下各項數據的含義。按行分析圖表,圖表中的數據不代表該項的耗電量,被着色只是表示該項處於激活狀態,它確實在耗電,但具體耗了多少電,圖表是量化不出來的,只能定性的分析它耗電了。另外圖表中耗電數據的呈現方式也不是按進程來組織的,而是按照耗電組件的方式排布,比如着大紅色top行表示當前運行在前臺的進程,切換前臺進程,不管當前前臺是哪個應用都始終被歸類在top行裏。

在上一張官方的圖例說明。
官方圖例說明
對照官方圖例介紹下各行的含義。

  • battery_level: 開始測試時的電量,之前抓取的圖可以看到電量是100,滿電狀態。
  • top: 前臺應用,如果要分析應用的耗電情況,那麼在測試期間,就該保證應用一直處於前臺。
  • wifi_running: wifi連接情況下的耗電情況,我抓取時沒開wifi,因此沒有看到該項。
  • screen: 亮屏狀態,可以看到圖表中該項着色有間隔,這是因爲實驗期間我關閉過屏幕,每關閉一次屏幕,着色就被打斷。
  • phone_in_call: 記錄打電話的耗電狀況。
  • wake_lock: 應用被喚醒,該項數據非常有意義,頻繁喚醒應用是高耗電的前兆,如果該項看到衆多色塊,往往需要重點去check。
  • running: cpu在運行,同樣表明在耗電。
  • wake_reason: 被喚醒的原因,去代碼看該次喚醒是否有必要,是否能將多個任務集中在一起,喚醒一次去執行。
    mobile_radio: BP側耗電,通常是指SIM卡,數據鏈接。該欄過多着色,間隔多。表示功耗也會高。

在細說下一點。有時數據量大,很多色被擠壓在一起不太方便觀察,此時可以用放大功能,類似systrace工具中的w鍵,但該工具做的沒systrace便利,還需要手動填寫縮放比例,具體下圖我放大了1000.
放大比例

放大後看看top項。
這裏寫圖片描述

這裏的u0a99代表的是進程id,某些手機能直接顯示出進程名,如果廠商該ROM,可能導致進程名無法顯示出來,這時可以去ps進程id,方向查到對應的包名。如果看的細心點還可以發現u0a99之後出現了u0a114,這個是因爲實驗時我切換了前臺應用,可以看到這個動作很精確的被historian捕捉到了。

電量監控分析

從官方文檔看該工具還能進行電量監控,但依賴源碼的某些文件。暫時還未完全配置好,先挖個坑,以後回填。
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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章