Android* 的喚醒鎖

WakeLock_WhitePaper.doc
BSD2.0.txt
WakeLock.zip

Christopher Bird

Android 電源管理 — 喚醒鎖全新上市

大多數人可能都遭遇過手機的電池續航時間較短帶來的尷尬。 這極其令人討厭。 沒電的手機和一塊水泥磚沒什麼差別。 一般而言,如果用戶的手機電池無法持續一整天,他們會感到非常不滿。而且,當手機充電時用戶無法使用手機,這同樣會帶來極大的不便。

傳統上需要使用筆記本電腦或 PC 處理的任務,現在借助全新的改進軟件,即使未在桌旁也可使用智能手機進行處理。 但是相比筆記本電腦,智能手機的小外形很大地限制瞭可容納的電池尺寸。 既要求手機具備筆記本電腦的功能,同時又要求其具備全天候的電池續航能力是難以實現的。

通過采用出色的電源管理,Android 和其他移動操作系統實現瞭耐久的電池續航時間。 停止使用手機後不久,顯示器便會關閉,CPU 會進入深度節能狀態,因此在不使用它時僅會消耗極少的電源。 這就是電話在使用時充一次電便能持續使用多日的原因。 借助 Android 的電源管理器,正常計劃是顯示器關閉時 CPU 也關閉。

但是,Android 開發人員能夠(並有權限)阻止 Android 設備進入睡眠模式。 他們可能希望讓 CPU 處於活動狀態 — 即使顯示器關閉。 或者可能他們希望在執行某項活動時阻止顯示器自動關閉。 出於此原因,Google* 在其 PowerManager API 中增加瞭喚醒鎖。 阻止設備進入睡眠模式的應用可以使用喚醒鎖。 隻要系統上有活動的喚醒鎖,設備便無法進入掛起模式,除非釋放喚醒鎖。 使用喚醒鎖時,一定要瞭解到當您不需要喚醒鎖時,必須將其正確釋放,因為未釋放的喚醒鎖無法進入默認狀態以節能,從而很快便會將設備的電池耗盡。

本文將會為您介紹一些在 Android 4.0 中默認使用喚醒鎖的 Android 應用(和使用模式),以便幫助您瞭解何時使用此項技術。 然後,將會介紹一個 SDPSamples 集中的示例應用“Wakelocks”,以展示如何編寫喚醒鎖的代碼。

喚醒鎖應用使用情況

借助 Android, 有一種方法可以查看哪些服務啟用瞭喚醒鎖,阻止系統進入低功耗狀態。 設備上的 /proc/wakelocks 文件列出瞭定義使用喚醒鎖的服務和驅動程序。 通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以瞭解 CPU 資源何時啟用瞭喚醒鎖,以及哪種服務啟用瞭 wakelock2。 我捕獲瞭幾種使用案例,其中運行 Android 4.0 的 Galaxy Nexus 上啟用瞭喚醒鎖,如下所示:

使用的應用 執行的操作 使用瞭喚醒鎖的服務 運行狀況
任意 按下 UI Widget(如點擊按鈕或 ListView 項) PowerManagerService 啟用並在 5 秒鐘後釋放鎖定
地圖/導航 啟用地圖或進入導航 gps-lock 啟用鎖定並使用 GPS
YouTube 觀看流視頻 PowerManagerService 在視頻播放的整個過程中一直啟用喚醒鎖
Music 聽音樂 PowerManagerService 在音樂播放的過程中一直啟用喚醒鎖

表格:一些默認的 Android 應用演示喚醒鎖的使用

YouTube 和 Music 應用能夠很好地展示不同級別的喚醒鎖。 用戶播放視頻時,YouTube 應用將會啟用喚醒鎖。 在播放視頻的整個過程中,顯示器會保持開啟狀態(忽略系統的顯示設置)。 但是,如果用戶在播放過程中按下瞭電源按鈕,設備將會掛起,這會導致顯示器關閉以及音頻/視頻停止播放。 Music 應用在播放音頻時使用不同的喚醒鎖。 顯示設置無法更改,因此設備的屏幕將會根據用戶的顯示設置來關閉。 顯示器關閉後,喚醒鎖會讓 CPU 保持活動狀態以便音頻能夠繼續播放 — 即使用戶按下瞭電源按鈕。

選擇喚醒鎖(在執行前)

在瞭解如何編寫喚醒鎖之前,一定要瞭解喚醒鎖的種類,以便為您的應用挑選最適合的喚醒鎖。 Android PowerManager API 介紹瞭多種用於更改設備電源狀態的喚醒鎖標記:

標記值 CPU 屏幕 鍵盤
PARTIAL_WAKE_LOCK 開啟 關閉 關閉
SCREEN_DIM_WAKE_LOCK 開啟 調暗(Dim) 關閉
SCREEN_BRIGHT_WAKE_LOCK 開啟 調亮(Bright) 關閉
FULL_WAKE_LOCK 開啟 調亮(Bright) 調亮(Bright)

表格: 源自 Android PowerManager API。

該 API 突出強調瞭喚醒鎖會顯著縮短 Android 設備的電池續航時間,因此如果可以避免應盡量減少使用它們。 如果使用,也應盡快將其釋放。

使用喚醒鎖的應用必須申請特別許可才可執行。 這可通過應用清單文件中的 android.permission.WAKE_LOCK 許可來實現。 也就是說,當用戶通過 Google Play 安裝使用喚醒鎖的應用時,系統會提醒他們該應用包含的特性可能會“Prevent phone from sleeping(阻止手機進入睡眠狀態)”。 如果開發人員希望阻止某個應用的顯示器在特定使用情況下變暗,可采用 Google 另外提供的一種方法,這種方法無需特別許可。 WindowManager 包括一個 FLAG_KEEP_SCREEN_ON
變量,當應用的視圖要阻止界面關閉時可對其進行設置。 建議在顯示控制上使用這種方法,因為其影響在應用內相互獨立。 用戶任務切換到其他應用上之後,WindowManager 將會立刻釋放喚醒鎖。

讓顯示器保持開啟狀態(源自 SDPSamples)

SDPSamples 集的喚醒鎖應用演示瞭(包括代碼)應用如何使用 Window Manager 而非通過編寫喚醒鎖代碼讓顯示器保持開啟狀態。 啟用喚醒鎖應用後,選擇“Win Man Screen On”列表項。

隻要按鈕的狀態顯示“Screen is LOCKED”,界面就會保持開啟狀態。 按鈕的狀態更改為“Screen is UNLOCKED”後,如果超過 5 秒鐘不操作,顯示器將會關閉。

在代碼中,每次按下按鈕且狀態發生改變時,通過設置和釋放當前窗口的 FLAG_KEEP_SCREEN_ON 變量可在 WakeLockActivity.java 中使用 screenLockUpdateState() 函數實現該操作。

01public void screenLockUpdateState() {
02
03 if (mIsDisplayLocked)
04 {
05 ...
06 // update display state
07 getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
08 } else
09{
10 ...
11 // update display state
12 getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
13 }
14}

編寫喚醒鎖(來自 SDPSamples)

SDPSamples 集中的喚醒鎖應用還包括執行不同喚醒鎖的代碼。 啟動喚醒鎖應用後,從下列四種喚醒鎖中選擇: Power Wake Lock Full、Power Wake Lock Bright、Power Wake Lock Dim 和 Power Wake Lock Partial。 這 4 個列表項對應著 PowerManager API 中介紹的 4 種喚醒鎖標記。 每一項將會分別演示 5 秒內嘗試關閉屏幕時設備如何響應。

通過監控 /sys/power/wake_lock 文件的內容(需要根訪問),您可以看到按下電源按鈕後 PARTIAL_WAKE_LOCK 是唯一仍然有效的喚醒鎖。 其他的喚醒鎖通過多種級別的亮度阻止顯示器關閉。

編寫喚醒鎖的第一步是申請許可,之後才可使用清單 AndroidManifest.xml 內的喚醒鎖:

這一步完成後,便可以創建喚醒鎖對象,包括控制喚醒鎖的獲取()函數和釋放()函數。 WakeLockActivity.java 文件內的編碼很好地展示瞭該情況:

01public void onCreate(Bundle savedInstanceState) {
02 ...
03 mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
04 ...
05 mWakeLock = mPowerManager.newWakeLock(mWakeLockState,
06 "UMSE PowerTest");
07 if (mWakeLock != null) {
08 mWakeLock.acquire();
09 ...
10 }
11}
12
13protected void onDestroy() {
14 if (mWakeLock != null) {
15 mWakeLock.release();
16 mWakeLock = null;
17 }
18 ...
19}

結論

喚醒鎖是 Android 中一款強大的概念,可支持開發人員修改設備的默認電源狀態。 在應用中使用喚醒鎖的風險:它會減少設備的電池續航時間。 使用喚醒鎖的明顯優點可在 Google 提供的多種默認應用中看得到,如道路導航和音樂/視頻播放。 因此,開發人員應自行確定他們的應用模型能否從使用喚醒鎖中得益。

關於作者

Christopher Bird 於 2007 年進入英特爾的 SSG,致力於構建支持凌動設備(手機和平板電腦)的生態系統

參考

1 Android 參考: https://developer.android.com/reference/android/os/PowerManager.html

2 LWN – “喚醒鎖和嵌入式問題”: https://lwn.net/Articles/318611/

聲明

本文件中包含關於英特爾產品的信息。 本文件不構成對任何知識產權的授權,包括明示的、暗示的,也無論是基於禁止反言的原則或其他。 英特爾不承擔任何其他責任。英特爾在此作出免責聲明:本文件不構成英特爾關於其產品的使用和/或銷售的任何明示或暗示的保證,包括不就其產品的(i)對某一特定用途的適用性、(ii)適銷性以及(iii)對任何專利、版權或其他知識產權的侵害的承擔任何責任或作出任何擔保。

除非經過英特爾的書面同意認可,英特爾的產品無意被設計用於或被用於以下應用:即在這樣的應用中可因英特爾產品的故障而導致人身傷亡。

英特爾有權隨時更改產品的規格和描述而毋需發出通知。 設計者不應信賴任何英特產品所不具有的特性,設計者亦不應信賴任何標有“保留權利”或“未定義”的說明或特性描述。 對此,英特爾保留將來對其進行定義的權利,同時,英特爾不應為因其日後更改該等說明或特性描述而產生的沖突和不相容承擔任何責任。 本文信息可能隨時更改,恕不另行通知。 請勿使用本文信息完成一項產品設計。


本文件所描述的產品可能包含使其與宣稱的規格不符的設計缺陷或失誤。 這些缺陷或失誤已收錄於勘誤表中,可索取獲得。 在發出訂單之前,請聯系當地的英特爾營業部或分銷商以獲取最新的產品規格。

索取本文件中或英特爾的其他材料中提的、包含訂單號的文件的復印件,可撥打1-800-548-4725,或登陸 https://www.intel.com/design/literature.htm

性能測試中使用的軟件和工作負載可能僅在英特爾微處理器上針對性能進行瞭優化。 諸如 SYSmark 和 MobileMark 等測試均系基於特定計算機系統、硬件、軟件、操作系統及功能。 上述任何要素的變動都有可能導致測試結果的變化。 請參考其他信息及性能測試(包括結合其他產品使用時的運行性能)以對目標產品進行全面評估。

對本文件中包含的軟件源代碼的提供均依據相關軟件許可而做出,任何對該等源代碼的使用和復制均應按照相關軟件許可的條款執行。

英特爾和 Intel 標識是英特爾在美國和/或其他國傢的商標。

英特爾公司 ? 2012 年版權所有。 所有權利受到保護。

*其他的名稱和品牌可能是其他所有者的資產。

發佈留言