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