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