天天看點

Android的WakeLock機制

  • 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中,如下圖:

Android的WakeLock機制

APP專項測試可以将平台log導出來,并編寫腳本掃描檔案,統計一段時間内APP的wakelock的次數和持續時間。