Android手機(jī)耗電解析:3G耗電是WiFi四倍
測試結(jié)論:
1)滅屏待機(jī)最省電:
a)任何App包括后臺Service應(yīng)該盡可能減少喚醒CPU的次數(shù),比如IM類業(yè)務(wù)的長連接心跳、QQ提醒待機(jī)鬧鐘類業(yè)務(wù)的alarm硬時鐘喚醒要嚴(yán)格控制;
b)每次喚醒CPU執(zhí)行的代碼應(yīng)該盡可能少,從而讓CPU迅速恢復(fù)休眠,比如申請wake lock的數(shù)量和持有時間要好好斟酌;
2)WiFi比蜂窩數(shù)據(jù),包括2G(GPRS)、3G更省電:
a)盡量在WiFi下傳輸數(shù)據(jù),當(dāng)然這是廢話,不過可以考慮在有WiFi的時候做預(yù)加載,比如應(yīng)用中心的zip包、手Q web類應(yīng)用的離線資源等;
b)非WiFi下,盡量減少網(wǎng)絡(luò)訪問,每一次后臺交互都要考慮是否必須。雖然WiFi接入方式已經(jīng)占到移動互聯(lián)網(wǎng)用戶的50%,但是是有些手機(jī)設(shè)置為待機(jī)關(guān)閉WiFi連接,即便有WiFi信號也只能切換到蜂窩數(shù)據(jù);
測試分析:
1)滅屏的情況:
a)滅屏待機(jī),CPU處于休眠狀態(tài),最省電(7mA);
b)滅屏傳輸,CPU被激活,耗電顯著增加,即便是處理1K的心跳包,電量消耗也會是待機(jī)的6倍左右(45mA);
c)滅屏傳輸,高負(fù)載download的時候WiFi最省電(70mA),3G(270mA)和2G(280mA)相當(dāng),是WiFi的4倍左右;
2)亮屏的情況:
a)亮屏待機(jī),CPU處于激活狀態(tài),加上屏幕耗電,整機(jī)電量消耗不?。?40mA);
b)亮屏傳輸,如果只是處理1K的心跳包,耗電增加不多(150mA),即便是很大的心跳包(64K),消耗增加也不明顯(160mA);
c)亮屏傳輸,高負(fù)載download的時候WiFi最省電(280mA),3G(360mA)和2G(370mA)相當(dāng),是WiFi的1.3倍左右;
3)Alarm喚醒頻繁會導(dǎo)致待機(jī)耗電增加:
手機(jī)滅屏后會進(jìn)入待機(jī)狀態(tài),這時CPU會進(jìn)入休眠狀態(tài)。Android的休眠機(jī)制介紹的文章很多,這里引用一段網(wǎng)絡(luò)文章:
Early suspend是android引進(jìn)的一種機(jī)制,這種機(jī)制在上游備受爭議,這里 不做評論。這個機(jī)制作用在關(guān)閉顯示的時候,在這個時候,一些和顯示有關(guān)的 設(shè)備,比如LCD背光,比如重力感應(yīng)器,觸摸屏,這些設(shè)備都會關(guān)掉,但是系統(tǒng)可能還是在運(yùn)行狀態(tài)(這時候還有wake lock)進(jìn)行任務(wù)的處理,例如在掃描SD卡上的文件等.在嵌入式設(shè)備中,背光是一個很大的電源消耗,所以android會加入這樣一種機(jī)制.
Late Resume是和suspend配套的一種機(jī)制,是在內(nèi)核喚醒完畢開始執(zhí)行的.主要就是喚醒在Early Suspend的時候休眠的設(shè)備.
Wake Lock在Android的電源管理系統(tǒng)中扮演一個核心的角色. Wake Lock是一種鎖的機(jī)制,只要有人拿著這個鎖,系統(tǒng)就無法進(jìn)入休眠,可以被用戶態(tài)程序和內(nèi)核獲得.這個鎖可以是有超時的或者是沒有超時的,超時的鎖會在時間過去以后自動解鎖.如果沒有鎖了或者超時了,內(nèi)核就會啟動休眠的那套機(jī)制來進(jìn)入休眠.
當(dāng)用戶寫入mem或者standby到/sys/power/state中的時候, state_store()會被調(diào)用,然后Android會在這里調(diào)用request_suspend_state()而標(biāo)準(zhǔn)的Linux會在這里進(jìn)入enter_state()這個函數(shù).如果請求的是休眠,那么early_suspend這個workqueue就會被調(diào)用,并且進(jìn)入early_suspend
簡單的說,當(dāng)用戶按power鍵,使得手機(jī)進(jìn)入滅屏休眠狀態(tài),Android系統(tǒng)其實(shí)是做了前面說的一些工作:關(guān)閉屏幕、觸摸屏、傳感器、dump當(dāng)前用戶態(tài)和內(nèi)核態(tài)程序運(yùn)行上下文到內(nèi)存或者硬盤、關(guān)閉CPU供電,當(dāng)然為了支持語音通訊,modern等蜂窩信令還是工作的。
這種情況下,應(yīng)用要喚醒CPU,只有兩種可能:
a)通過服務(wù)器主動PUSH數(shù)據(jù),通過網(wǎng)絡(luò)設(shè)備激活CPU;
b)設(shè)置alarm硬件鬧鐘喚醒CPU;
這里我們重點(diǎn)分析第二種情況。首先來看看什么是alarm硬件鬧鐘。Google官方提供的解釋是:Android提供的alarm services可以幫助應(yīng)用開發(fā)者能夠在將來某一指定的時刻去執(zhí)行任務(wù)。當(dāng)時間到達(dá)的時候,Android系統(tǒng)會通過一個Intent廣播通知應(yīng)用去完成這一指定任務(wù)。即便CPU休眠,也不影響alarm services的服務(wù),這種情況下可以選擇喚醒CPU。
顯然喚醒CPU是有電量消耗的,CPU被喚醒的次數(shù)越多,耗電量會越大?,F(xiàn)在很多應(yīng)用為了維持心跳、拉取數(shù)據(jù)、主動PUSH會不同程度地注冊alarm服務(wù),導(dǎo)致Android系統(tǒng)被頻繁喚醒。這就是為什么雷軍說Android手機(jī)在安裝了TOP100的應(yīng)用后,待機(jī)時間會大大縮短的重要原因。
比較簡單評測CPU喚醒次數(shù)的方法是看dumpsys alarm,這里會詳細(xì)記錄從開機(jī)到當(dāng)前的各個進(jìn)程和服務(wù)喚醒CPU的次數(shù)和時間。通過對比喚醒次數(shù)和喚醒時間可以幫助我們分析后臺進(jìn)程和服務(wù)的耗電情況。Dumpsys alarm的輸出看起來像這樣:
其中544代表喚醒次數(shù),38684ms代表喚醒時間。更詳細(xì)的alarm services相關(guān)資料請參考Google官方定義:
http://developer.android.com/reference/android/app/AlarmManager.html
4)Wake locks持有時間過長會導(dǎo)致耗電增加:
Wake locks是一種鎖機(jī)制,有些文獻(xiàn)翻譯成喚醒鎖。簡單說,前面講的滅屏CPU休眠還需要做一個判斷,就是看是否還有任何應(yīng)用持有wake locks。如果有,CPU將不會休眠。有些應(yīng)用不合理地申請wake locks,或者申請了忘記釋放,都會導(dǎo)致手機(jī)無法休眠,耗電增加。
關(guān)于wake locks的網(wǎng)絡(luò)文章也比較多,也可以參考Google官方文獻(xiàn):
http://developer.android.com/reference/android/os/PowerManager.WakeLock.html
原始數(shù)據(jù):
測試方法:硬件設(shè)備提供穩(wěn)壓電源替代手機(jī)電池供電,在不同場景下記錄手機(jī)平均電流。[!--empirenews.page--]
測試設(shè)備:Monsoon公司的Power Monitor TRMT000141
測試機(jī)型:
3G耗電是WiFi四倍4' />
測試用例: