上圖為2016年6月Google更新的Android系統分布圖,顯示運行每個Android版本的活躍用戶比例,由上圖得知,5.0及以上系統占比正在加大,而4.X占比依然是最多的,所以耗電量分析也要從4.X和5.0級以上的系統來研究。
Android應用耗電量一直是比較麻煩的,也是大家所關注的問題,在4.4系統之前,google一直沒有相關API暴露給外面,所以要研究4.4系統以前的耗電量,就需要研讀Android的源碼;5.0之后的系統,就可以使用adb命令直接獲取。
源碼中到底哪個部分是真正計算耗電量的呢?首先打開Android系統源碼,找到設置的activity中的電池的部分,也就是”com.android.setting.fuelaguge”這個包里面的PowerUsageSummary類,該類是篩選耗電量最多的前十個應用,而真正計算app的耗電量的是BatteryStatsHelper這個類中的processAppUsage,所以只需要研究processAppUsage這個類的具體實現方法就可以解開我們的疑惑啦~
仔細查看BatteryStatsHelper中的processAppUsage這個類,就可以看出,每個app的耗電量主要由以下幾個方面決定:cpu的耗電量、wakelock的耗電量、wifi的耗電量、移動數據的耗電量和其他傳感器的耗電量。
如上圖源碼,cpu的耗電量為cpu的運行時間和cpu每秒耗電的乘積(里面值得注意的是CPU的速度分為幾個檔次,每個檔次的每秒耗電不同)。
如上圖源碼,wakelock的耗電量為partial wake locks的次數和每次wakelock的耗電的乘積。WakeLock是一種鎖機制,只要有人拿著這把所,系統就無法進入休眠階段。其實android系統有多種類型的wakelock,partialwake lock、screendimwake lock、screenbrightwake lock和fullwake lock四中,四種wakelock的共同的都是保持CPU運行,但是屏幕和鍵盤燈有區別,這個源碼中,只計算了partialwake lock這一種情況,而且只計算了其中的cpu的影響。
Wifi的耗電量包括三個部分,一個是wifi流量、wifi維持耗電量和wifi掃描耗電量,最重要的還是wifi流量耗電量。
4.4的源碼中,移動網絡的耗電量,是根據移動網絡的上傳和下載的流量之和與每字節流量的耗電量的乘積。5.0及以后的版本,移動網絡的耗電量是根據packet個數來計算耗電量。
傳感器耗電量計算方式為各種傳感器的單位時間耗電量(multiplier)和運行時間(sensorTime)的乘積之和。不過GPS傳感器和其他傳感器的單位耗電量計算方式不同。
Android5.0后,就可以直接使用adb命令很方便的獲取電量了,具體方法如下:
首先通過app的包名獲取其PID(Process Identifier):adb shell ps |find “com.baidu.example”,獲取的數據第一個參數就是UID,需要將該UID換成標準格式,如下圖,去掉下劃線即為該app的UID。
通過UID和包名獲取該app的自從數據線上次拔插的電量:adb shell dumpsys batterystats “com.baidu.example” |find “***”,將***替換成UID即可,如下圖,獲取到的app的電量為6.47mAh。
如果想看到完整耗電量的數據,可以直接將batterystats的內容保存在本地。
文件里面有很詳細的耗電量信息,包括:battery history:哪個應用打開了多少秒,之后做了哪些操作等
Per-PID Stats:每個應用的wake timeEstimated Power User:里面包括每個應用的耗電量(上面方法就是獲取該耗電量)
還有All kernel wake locks和All partial wake locks等
也可以通過該方法獲取競品的待機耗電量和相同操作下的功能耗電量,與自身app進行比對。
由以上分析每個App的耗電量主要由以下幾個方面決定:cpu的耗電量、wakelock的耗電量、wifi的耗電量、移動數據的耗電量和其他傳感器的耗電量,而從dumpsys batterystats中獲取的是App的總耗電量,怎么區分到底是哪些部分更耗電呢?
介紹2款App,適用條件:手機需root
一個是google公司研發的功耗分析的工具PowerTutor,優點是可以在將數據在同一環境下與競品的數據進行比對,可以方便的開始記錄,并且可以導出log,log每分鐘記錄一次所有應用的功耗,包含了LCD,CPU,GPS,3G等產生功耗,缺點是PowerTutor并不通用,只實現了3中機型:G1、G2和Nexus One,其余的機型都歸為Unknown,數據可能不夠精確,如果測試條件允許的話,還是最好使用支持的機型,apk直接在應用市場中搜索下載。
另外一個是BetterBatteryStats,該工具是asksven研發的,主要是用來檢測待機情況下,每個應用對手機電池的影響,該應用主要分wakelock、alarm、network三種情況下每個應用的情況,可以用該應用來初步判定App電池耗電的主要原因,在alarm數據中,顯示每個應用自手機開機被喚醒的次數,占比,點擊某個應用,會顯示該應用的耗電最多的操作;network數據中,會顯示每個應用通過網絡傳輸數據的字節數和占比,如下圖:
介紹一個google工具,battery history,適用條件:5.0及以上手機。
需要下載batteryhistory相關的腳本,具體步驟:首先進行初始化操作,打開電池數據的獲取以及重置(下圖步驟1/2),然后進行一些操作,手動或者自動化都可以,經過一段時間后,獲取bugreprot信息,并將其轉化為html文件(下圖步驟3/4)
打開html文件如下,橫坐標是時間,縱坐標是每個影響電量指標的參數。
如果你看的意猶未盡,如果你想隨時隨地充實自己,請登錄MTC官網(mtc.baidu.com),可以獲取更多技術類干貨,還有精彩活動與你分享~
百度移動云測試中心簡稱MTC(Mobile Testing Center),基于眾包模式和云技術,為每個App提供一站式測試服務。針對不同開發階段、不同團隊規模提供定制化解決方案,不論是0測試團隊,還是追求極致用戶體驗的產品,讓創業者從此告別App開發過程中面臨的缺設備、缺人力、缺技術囧境。 擁有千人測試團隊,上萬臺真機; 專注App測試領域,提供全面兼容測試、深度性能測試; 擁有海量用戶資源,支持功能測試、探索測試、問題定位測試。 MTC 精益求精的開發者最終的選擇!