1. 课程导入

在移动终端体验中,续航与性能始终是一对需要精细平衡的矛盾。Android 电源管理与系统休眠工程,正是围绕“谁在耗电、为什么耗电、如何让系统在合适的时候进入低功耗状态、又如何在需要时快速唤醒”这一主线展开的系统性工程。它横跨应用层、框架层、HAL 层、内核层与硬件 PMIC,既涉及策略设计,也涉及驱动实现与问题定位。本课程的目标,是帮助学习者建立从功耗现象到系统机制的完整认知链路,并具备独立分析、调试与优化 Android 休眠与唤醒问题的能力。

一、学习目标:从“看现象”到“改机制”

本课程不是简单的 API 罗列,而是以工程问题驱动。完成学习后,应达到以下目标:

  • 理解 Android 电源管理整体架构,掌握 PowerManager、WakeLock、AlarmManager、JobScheduler、Doze/App Standby 等核心机制。
  • 掌握系统休眠的完整路径,包括屏幕熄灭、CPU 挂起、Suspend-to-RAM、Runtime PM 与系统级 suspend 的协同关系。
  • 能够阅读并分析 /sys/power/state、/sys/kernel/debug/wakeup_sources、dumpsys power、dumpsys batterystats 等关键节点与日志。
  • 能够定位“无法进入休眠”“频繁被唤醒”“待机电流偏高”等典型问题,并给出可验证的修复方案。
  • 建立功耗测试与回归意识,能够设计待机电流、唤醒次数、休眠占比等量化指标。
核心判断:Android 电源管理不是单一模块,而是“应用请求 → 框架策略 → 内核电源管理 → 硬件低功耗状态”的跨层协作链。任何一层异常,都会表现为整机续航问题。

二、核心概念:建立统一语言

在进入具体调试之前,需要先统一几个高频概念。WakeLock 是应用或系统服务持有的“阻止休眠”锁,分为 PARTIAL_WAKE_LOCK、SCREEN_DIM_WAKE_LOCK 等类型;其中 PARTIAL_WAKE_LOCK 只保持 CPU 运行,不点亮屏幕,是待机功耗分析的重点。AlarmManager 负责定时唤醒,RTC 与 ELAPSED_REALTIME 的选择会直接影响休眠行为。Doze 模式则在设备静止、熄屏、未充电时逐步限制网络与任务,是 Android 6.0 之后待机优化的核心策略。

在内核侧,Runtime PM 管理单个设备的运行时电源状态,System Suspend 则让整机进入低功耗。Wakeup Source 是唤醒源抽象,任何能够把系统从 suspend 中拉起的设备或事件,都会在 wakeup_sources 中留下计数与活跃时间。理解这些概念之间的层级关系,是后续排障的基础。

Android 电源管理与系统休眠跨层协作链 应用请求 → 框架策略 → 内核电源管理 → 硬件低功耗状态 应用层 WakeLock / Alarm JobScheduler / FCM 框架层 PowerManagerService Doze / App Standby 内核层 Runtime PM / Suspend Wakeup Source 硬件层 PMIC / CPU Idle Suspend-to-RAM 关键观测点与调试入口 dumpsys power WakeLock / 状态 dumpsys batterystats 耗电归因 wakeup_sources 唤醒源计数 /sys/power/state 休眠状态控制 典型问题与排查方向 无法进入休眠 检查 WakeLock / 唤醒源 频繁被唤醒 Alarm / 中断 / 网络 待机电流偏高 Runtime PM / 外设

三、整体知识框架:四层三线

本课程的知识框架可以概括为“四层三线”。四层即应用层、框架层、内核层、硬件层;三线即功耗来源线、休眠控制线、唤醒路径线。功耗来源线关注谁在持有资源、谁在发起网络与计算;休眠控制线关注系统如何判定可以进入低功耗、如何冻结进程与设备;唤醒路径线关注中断、Alarm、网络包如何把系统拉起。三条线在 PowerManagerService 与内核 suspend 流程中交汇,形成完整的电源管理闭环。

层级 核心对象 关键问题 常用工具/节点
应用层 WakeLock、Alarm、Job、FCM 是否滥用唤醒、是否及时释放 Battery Historian、dumpsys
框架层 PowerManagerService、Doze、App Standby 策略是否生效、白名单是否合理 dumpsys power、deviceidle
内核层 Runtime PM、System Suspend、Wakeup Source 设备是否允许挂起、谁在阻止 suspend wakeup_sources、ftrace、dmesg
硬件层 PMIC、CPU Idle、外设电源域 低功耗状态是否真正进入 电流表、示波器、寄存器

四、实战路线图:从观测到修复

实战部分建议遵循“先观测、再归因、后修复、终验证”的路线。第一步,使用电流表或 Battery Historian 建立待机功耗基线,记录熄屏后 5 分钟、30 分钟、8 小时的电流曲线。第二步,通过 dumpsys power 查看 WakeLock 持有情况,通过 /sys/kernel/debug/wakeup_sources 查看活跃唤醒源。第三步,结合 dmesg 与 ftrace 判断是应用持有锁、Alarm 频繁触发,还是某个驱动阻止了 Runtime PM。第四步,修改策略或驱动后,用相同场景复测,确认唤醒次数与待机电流下降。

# 查看当前 WakeLock 与电源状态
adb shell dumpsys power | grep -E "Wake Locks|mWakefulness|mHolding"

# 查看唤醒源活跃情况
adb shell cat /sys/kernel/debug/wakeup_sources

# 查看内核 suspend 相关日志
adb shell dmesg | grep -iE "suspend|resume|wakeup|pm:"

# 查看 Doze 与设备空闲状态
adb shell dumpsys deviceidle
建议在每次修改后固定测试条件:相同电量区间、相同网络环境、相同后台应用集合。否则功耗数据波动会掩盖真实问题。

五、常见误区与复盘

初学者最容易陷入三个误区。第一,把“熄屏”等同于“休眠”。实际上熄屏后 CPU 仍可能运行,WakeLock 未释放时系统无法进入 suspend。第二,只关注应用层,忽略内核唤醒源。很多待机功耗问题来自传感器、Wi-Fi、Modem 或充电 IC 的中断,而非应用。第三,缺少量化验证。仅凭“感觉更省电”无法支撑工程结论,必须用唤醒次数、休眠占比、平均电流等指标闭环。

排障时不要一上来就改代码。先确认问题发生在哪一层:是应用持有 PARTIAL_WAKE_LOCK,还是框架策略未生效,还是内核设备阻止 suspend。层级判断错误,修复往往无效甚至引入新问题。

本课程后续将沿着这条路线逐步展开:先建立电源管理与休眠的基础模型,再深入 WakeLock、Alarm、Doze、Runtime PM、System Suspend、唤醒源与功耗测试,最终形成一套可复用的 Android 低功耗工程方法。掌握这套方法后,你面对的不再是零散的日志与参数,而是一条可以追踪、可以验证、可以优化的完整电源链路。