PowerManagerService(PMS):螢幕喚醒、Doze、電源管理
intro
在行動裝置的世界裡,電源管理 (Power Management) 是系統設計中最重要的一環。智慧型手機的使用者最關注的體驗之一,就是「續航力」與「即時回應性」。
在 Android Framework 當中,負責核心電源管理的系統服務就是 PowerManagerService (PMS)。它不僅負責螢幕亮滅、CPU 喚醒與休眠,還與 Doze 模式、App Standby、WakeLock 機制 以及 Battery Stats 等子系統緊密結合,確保 Android 裝置在不同使用場景下都能兼顧效能與電池續航。
電源管理的挑戰與需求
行動裝置的電源管理必須同時滿足以下需求:
- 即時回應性 (Responsiveness)
- 使用者按下電源鍵或觸控螢幕,系統必須立即點亮螢幕並處理事件。
- 背景運算需求 (Background Execution)
- App 在背景仍需要進行任務(例如音樂播放、導航、鬧鐘提醒)。
- 必須保證 CPU 在必要時保持喚醒,避免任務中斷。
- 省電策略 (Battery Saving)
- 在螢幕熄滅、裝置閒置時,應進入 Doze 或 App Standby,降低耗電。
- 硬體協同控制 (Hardware Control)
- CPU、GPU、Display、Sensor、Wi-Fi、Modem 等元件都與電源狀態息息相關,必須透過 PMS 協同管理。
PMS 的核心角色就是:在效能與電源節能之間,提供一個智慧的調度中心。
PowerManagerService 架構總覽
在 Android Framework 中,PowerManagerService (PMS) 負責全局的電源狀態管理,並與底層 Power HAL、Kernel Power Management (suspend/resume) 進行交互。

- App 層
- 透過 PowerManager API 取得電源狀態,或申請 WakeLock。
- Framework 層 (PMS)
- 決策電源狀態,包括螢幕亮滅、CPU 喚醒、Doze 模式切換。
- HAL 層
- Kernel 層
- 提供底層 suspend/resume 機制,並由 Wakelock 確保系統不會過早進入休眠。
WakeLock 機制與螢幕喚醒
在 Android 中,應用程式或系統服務可以透過 WakeLock 來要求系統保持某些狀態(例如 CPU 運行、螢幕點亮)。
WakeLock 類型
- Partial WakeLock
- 保持 CPU 運行,但不一定點亮螢幕。
- 例:音樂播放、下載檔案。
- Full WakeLock (Deprecated)
- Screen Bright / Screen Dim
螢幕喚醒流程
-
使用者按下 電源鍵,或系統事件(鬧鐘、來電)觸發。
-
InputManagerService 送出 KeyEvent。
-
WindowManagerPolicy 判斷是否需要喚醒螢幕。
-
呼叫 PowerManagerService.wakeUp()。
-
PMS 透過 Power HAL 控制 Display,點亮螢幕。
-
通知 WindowManagerService / SurfaceFlinger 進行視覺更新。
-
核心觀念:WakeLock 是 防止進入休眠,而螢幕點亮與否則是由 PMS 調度的 Display Power State。
Doze 模式與省電策略
Android 6.0 之後引入 Doze 模式,主要目的是降低長時間閒置時的耗電。
Doze 模式觸發條件
- 裝置螢幕關閉。
- 裝置靜止不動(加速度計檢測)。
- 電池未充電。
Doze 狀態機制
- Idle Pending → 系統準備進入 Doze。
- Idle → 網路、Alarm 被限制,只有 GCM High Priority 可以喚醒。
- Maintenance Window → 短暫允許網路與任務執行。
- Deep Idle → 更嚴格限制。
PMS 與 Doze 的關聯
- PMS 與 DeviceIdleController 協作,決定是否進入 Doze。
- App 若需要在 Doze 期間運作,必須透過 白名單 (Whitelist) 或 高優先級 FCM。
PMS 與其他系統服務的交互
- 與 AMS (ActivityManagerService)
- AMS 根據應用前後台狀態,向 PMS 建議螢幕與 CPU 狀態。
- 與 WMS (WindowManagerService)
- 與 IMS (InputManagerService)
- Input Event (Power 鍵、Home 鍵) 可能觸發螢幕喚醒。
- 與 BatteryStatsService
- 記錄電池消耗來源,追蹤 WakeLock 使用情況。
- Power HAL
- HAL 層接收「省電模式」指令,調整 CPU 頻率、GPU 運作等。
use cases:螢幕點亮與休眠過程
螢幕點亮
- 使用者按下電源鍵 → IMS 捕捉事件。
- PhoneWindowManager 判斷需要喚醒螢幕。
- 呼叫 PMS.wakeUp()。
- PMS 更新 DisplayPowerController 狀態,透過 SurfaceFlinger 渲染畫面。
- WMS 更新應用畫面 → UI 顯示。
螢幕休眠
- 使用者按下電源鍵,或系統超時自動休眠。
- PMS.goToSleep() → 設定 CPU Idle 狀態。
- 通知 HAL 關閉背光。
- Kernel 若無 Wakelock,進入 suspend。
questions
- 解釋 Android 的 WakeLock 機制,Partial WakeLock 與 Full WakeLock 的差異?
- Doze 模式是如何節省電力的?哪些情況下仍允許網路存取?
- PMS 如何與 Kernel 的 suspend/resume 機制協作?
- 描述螢幕點亮的完整流程,從按下電源鍵到 UI 顯示。
- App 如何避免因為 Doze 模式而無法即時收到通知?
- Wakelock 若未正確釋放會造成什麼後果?如何檢測?
summary
PowerManagerService 是 Android Framework 中最核心的電源管理組件,它不僅控制螢幕與 CPU 的狀態,還協調 Doze 模式 與 WakeLock 機制,確保裝置在不同情境下都能在 效能 與 電池續航 之間達到最佳平衡。