电源管理服务组件

简介

电源管理服务组件提供如下功能:

  1. 重启系统。
  2. 管理休眠运行锁。
  3. 系统电源状态查询。

图 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

powermgr_display_manager

powermgr_battery_manager

powermgr_thermal_manager

powermgr_battery_statistics

powermgr_battery_lite

powermgr_powermgr_lite

OpenHarmony 电源管理模块状态转换分析

一、电源状态定义 (power_state_machine_info.h:56-106)

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 电源管理状态转换图

完整电源状态转换图

三、各场景详细状态转换分析

1. 亮灭屏转换 (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,取消活动定时器

2. S3 睡眠转换 (SLEEP状态)

代码位置: suspend_controller.cpp:799-839
S3 睡眠转换
强制睡眠实现 (suspend_controller.cpp:799-839):

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);
}

3. S4 Hibernate 休眠转换

代码位置: hibernate_controller.cpp 和 power_state_machine.cpp:415-422
S4 Hibernate 休眠转换
Hibernate实现 (hibernate_controller.cpp:22-28):

HibernateStatus HibernateController::Hibernate(bool clearMemory)
{
    if (SystemSuspendController::GetInstance().Hibernate()) {
        return HibernateStatus::HIBERNATE_SUCCESS;
    }
    return HibernateStatus::HIBERNATE_FAILURE;
}

4. 开合盖场景转换

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

四、状态转换限制矩阵

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

五、RunningLock 阻止机制

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

六、完整的场景流程图

┌─────────────────────────────────────────────────────────────────────────────────────┐
│ 完整电源状态转换流程 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【亮屏流程】 │
│ ┌──────────┐ 用户活动(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() │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘

完整的场景流程图-01
完整的场景流程图-02

七、关键文件汇总

关键文件汇总

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

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐