- WakeLock原理和手機耗電:
手機功耗本質是硬體工作的消耗,手機主要功耗硬體如下:CPU GPU soc Vedio 和外設。記憶體本身是不耗電的,隻是作為程式的臨時住所;
Wake Lock 是Android提供給開發者的一個方法,主要的作用是對關鍵程序進行強制性的運作,正常情況下手機滅屏了就不使用了,硬體應該也就停止工作了,單總有例外,如音樂、短信接收等;是以Android系統提供Wake Lock機制,提供了Wake Lock的API,使得應用程式有權限通過代碼阻止AP進入休眠狀态,這種開放性導緻流氓軟體 ,即使手機滅屏,程式仍然會在背景運作占用資源,對功耗和手機性能産生影響。
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); WakeLock sCpuWakeLock = pm.newWakeLock(
PowerManager.FULL_WAKE_LOCK |
PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag");
if (sCpuWakeLock!= null) {
sCpuWakeLock.release();
sCpuWakeLock = null;
}
PARTIAL_WAKE_LOCK:保持CPU 運轉,螢幕和鍵盤燈有可能是關閉的。
SCREEN_DIM_WAKE_LOCK:保持CPU 運轉,允許保持螢幕顯示但有可能是灰的,允許關閉鍵盤燈
SCREEN_BRIGHT_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,允許關閉鍵盤燈
FULL_WAKE_LOCK:保持CPU 運轉,保持螢幕高亮顯示,鍵盤燈也保持亮度
ACQUIRE_CAUSES_WAKEUP:不會喚醒裝置,強制螢幕馬上高亮顯示,鍵盤燈開啟。有一個例外,如果有notification彈出的話,會喚醒裝置。
ON_AFTER_RELEASE:WakeLock 被釋放後,維持螢幕亮度一小段時間,減少WakeLock 循環時的閃爍情況
如果申請了partial wakelock,那麼即使按Power鍵,系統也不會進Sleep,如Music播放時 如果申請了其它的wakelocks,按Power鍵,系統還是會進Sleep
但如果不領會Android設計者的意圖而濫用Wake Lock API,為了自身程式在背景的正常工作而長時間阻止AP進入休眠狀态,就會成為待機電池殺手。
- APP專項測試和手機耗電測試
應用濫用WakeLock和Alarm機制,會造成滅屏待機過程中手機經常被喚醒,無法進入深度睡眠耗電嚴重,尤其是BAT系的全家桶應用,在Android手機系統耗電測試和APP專項測試中,檢測滅屏待機耗電是一項重要工作;
在Android手機測試中,主要是log中讀取相關資訊,以MTK平台為例,抓取MTKLOG,wakelock相關的log存儲在sys_log中,如下圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICOzIzM1ADMxEjMyMDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
APP專項測試可以将平台log導出來,并編寫腳本掃描檔案,統計一段時間内APP的wakelock的次數和持續時間。