电源管理服务组件
简介
电源管理服务组件提供如下功能:
- 重启系统。
- 管理休眠运行锁。
- 系统电源状态查询。
图 1 电源管理服务组件架构图

目录
/base/powermgr/power_manager
├── figures # 架构图
├── frameworks # Framework层
│ ├── napi # NAPI层
│ └── native # Native层
├── interfaces # 接口层
│ └── inner_api # 内部接口
├── sa_profile # SA 配置文件
├── services # 服务层
│ ├── native # Native 层
│ └── zidl # Zidl 接口层
├── test # 测试用例
│ ├── fuzztest # Fuzz 测试
│ ├── unittest # 单元测试
│ ├── systemtest # 系统测试
│ └── utils # 测试工具
└── utils # 工具和通用层
相关仓
电源管理模块源代码链接为:https://gitcode.com/openharmony/powermgr_power_manager
powermgr_power_manager
OpenHarmony 电源管理模块状态转换分析
一、电源状态定义 (power_state_machine_info.h:56-106)
cpp
enum class PowerState : uint32_t {
AWAKE = 0, // 屏幕亮,CPU运行 (正常工作状态)
FREEZE, // 屏幕亮,后台进程冻结
INACTIVE, // 屏幕灭,CPU运行 (灭屏)
STAND_BY, // 屏幕灭,部分进程冻结
DOZE, // 屏幕灭,大部分进程冻结 (Doze模式)
SLEEP = 85, // S3 - 屏幕灭,CPU停止,内存供电
HIBERNATE = 90,// S4 - 屏幕灭,CPU停止,内存内容保存到磁盘
SHUTDOWN, // 关机
DIM, // 屏幕变暗 (亮度降低)
UNKNOWN
};
二、OpenHarmony 电源管理状态转换图

三、各场景详细状态转换分析
- 亮灭屏转换 (AWAKE ↔ INACTIVE)
代码位置: power_state_machine.cpp:296-380

代码分析:
- AWAKE状态 (行296-335): 设置DisplayState为DISPLAY_ON,唤醒系统
- DIM状态 (行434-470): 设置DisplayState为DISPLAY_DIM,设置弱定时器
- INACTIVE状态 (行347-381): 设置DisplayState为DISPLAY_OFF,取消活动定时器
- S3 睡眠转换 (SLEEP状态)
代码位置: suspend_controller.cpp:799-839

强制睡眠实现 (suspend_controller.cpp:799-839):
cpp
void SuspendController::HandleForceSleep(SuspendDeviceType reason)
{
// 1. 设置强制睡眠标志
SetForceSleepingFlag(true);
// 2. 设置电源状态为SLEEP
stateMachine_->SetState(PowerState::SLEEP, reason, true);
// 3. 触发同步睡眠回调
TriggerSyncSleepCallback(false);
// 4. 延迟8秒后执行底层Suspend
ffrtTimer_->SetTimer(TIMER_ID_SLEEP, task, FORCE_SLEEP_DELAY_MS);
}
- S4 Hibernate 休眠转换
代码位置: hibernate_controller.cpp 和 power_state_machine.cpp:415-422

Hibernate实现 (hibernate_controller.cpp:22-28):
cpp
HibernateStatus HibernateController::Hibernate(bool clearMemory)
{
if (SystemSuspendController::GetInstance().Hibernate()) {
return HibernateStatus::HIBERNATE_SUCCESS;
}
return HibernateStatus::HIBERNATE_FAILURE;
}
- ULSR (User Space Light Sleep) 机制
代码位置: ulsr_callback_holder.cpp/h 和 suspend_controller.cpp

- 开合盖场景转换
代码位置: suspend_controller.cpp:897-1103

四、状态转换限制矩阵
代码位置: power_state_machine.cpp:137-191

五、RunningLock 阻止机制
代码位置: power_state_machine.cpp:95-113

六、完整的场景流程图
┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 完整电源状态转换流程 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【亮屏流程】 │
│ ┌──────────┐ 用户活动(Touch/Key/App) ┌──────────┐ │
│ │ INACTIVE│ ─────────────────────────────▶│ AWAKE │ │
│ │ (灭屏) │ │ (亮屏) │ │
│ └──────────┘ └────┬─────┘ │
│ │ │
│ 【灭屏流程】 │ 超时(默认30秒) │
│ ┌──────────┐ 用户无操作 ┌──────────┴──────────┐ │
│ │ AWAKE │ ──────────────────▶ │ DIM (变暗) │ ◀── │ ─ ─ ─ │ │
│ │ (亮屏) │ └──────────────┘ │ │
│ └──────────┘ │ │ │
│ │ 继续超时 ▼ │
│ ┌──────────────┐ ┌──────────┐ │
│ │ INACTIVE │──│ SLEEP │ │
│ │ (灭屏,CPU运行)│ │ (S3) │ │
│ └──────────────┘ └────┬─────┘ │
│ │ │
│ 【合盖睡眠】 │ RunningLock释放 │
│ ┌──────────┐ Lid合上 ┌────────────────────┐ │ │
│ │ AWAKE │ ─────────────▶│ LidSuspendMonitor │ │ │
│ │ (亮屏) │ └─────────┬───────────┘ │ │
│ └──────────┘ │ │ │
│ ▼ │ │
│ SetState(SLEEP) ◀──────────┘ │
│ │
│ 【强制睡眠】 │
│ ┌──────────┐ 电源键长按/系统请求 ┌────────────────────┐ │
│ │ AWAKE │ ─────────────────────▶│ HandleForceSleep() │ │
│ │ (亮屏) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ 设置forceSleeping_=true │
│ ▼ │
│ SetState(PowerState::SLEEP) │
│ │ │
│ ▼ 8秒延迟 │
│ SystemSuspendController::Suspend() │
│ │
│ 【S4休眠】 │
│ ┌──────────┐ 电池低/长按/配置 ┌────────────────────┐ │
│ │ SLEEP │ ─────────────────────▶│ HandleHibernate() │ │
│ │ (S3) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ PreHibernate() │
│ ▼ │
│ SystemSuspendController::Hibernate() │
│ │ │
│ ▼ PostHibernate() │
│ │
│ 【ULSR唤醒】 │
│ ┌──────────┐ 外部事件 ┌────────────────────┐ │
│ │ SLEEP │ ──────────────▶│ WakeupController │ │
│ │ (S3) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ WakeupDeviceType::WAKEUP_DEVICE_FROM_ULSR │
│ ▼ │
│ SetState(PowerState::AWAKE) │
│ │ │
│ ▼ UlsrCallbackHolder::WakeupNotify() │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘


七、关键文件汇总

这个状态转换图展示了OpenHarmony电源管理模块的完整工作流程,涵盖了从亮灭屏、S3/S4睡眠、开合盖等所有关键场景的状态转换逻辑。