iT邦幫忙

2025 iThome 鐵人賽

DAY 18
0

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) 進行交互。

https://ithelp.ithome.com.tw/upload/images/20251002/20178907KjLy2MeSjR.png

  • 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 與其他系統服務的交互

  1. 與 AMS (ActivityManagerService)
  • AMS 根據應用前後台狀態,向 PMS 建議螢幕與 CPU 狀態。
  1. 與 WMS (WindowManagerService)
  • 螢幕點亮後,WMS 負責視窗的排版與輸入分發。
  1. 與 IMS (InputManagerService)
  • Input Event (Power 鍵、Home 鍵) 可能觸發螢幕喚醒。
  1. 與 BatteryStatsService
  • 記錄電池消耗來源,追蹤 WakeLock 使用情況。
  1. 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 機制,確保裝置在不同情境下都能在 效能 與 電池續航 之間達到最佳平衡。


上一篇
#16
下一篇
#18
系列文
安豬複習20
  1. 16
    #15
  2. 17
    #16
  3. 18
    #17
  4. 19
    #18
  5. 20
    #19
完整目錄
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言