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

电源管理服务组件

简介

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

  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)

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

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

  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,取消活动定时器
  1. 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);
}
  1. 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;
}
  1. ULSR (User Space Light Sleep) 机制
    代码位置: ulsr_callback_holder.cpp/h 和 suspend_controller.cpp
  2. 开合盖场景转换
    代码位置: 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睡眠、开合盖等所有关键场景的状态转换逻辑。

相关推荐
Yu_Lijing2 小时前
基于C++的《Head First设计模式》笔记——解释器模式
c++·设计模式·解释器模式
C++ 老炮儿的技术栈2 小时前
c++常见配置文件格式 JSON、INI、XML、YAML 它们如何解析
xml·开发语言·c++·windows·qt·json
是娇娇公主~2 小时前
C++ 中 std::vector 和 std::list 的区别
开发语言·c++·list
国医中兴2 小时前
ClickHouse集群部署与管理:从0到1的实战指南
flutter·harmonyos·鸿蒙·openharmony
m0_730115112 小时前
C++中的装饰器模式实战
开发语言·c++·算法
m0_743470372 小时前
C++中的适配器模式
开发语言·c++·算法
Oueii3 小时前
模板代码模块化设计
开发语言·c++·算法
m0_730115113 小时前
C++与Rust交互编程
开发语言·c++·算法
旖-旎3 小时前
前缀和(连续数组)(7)
c++·算法·leetcode·前缀和·哈希算法