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