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睡眠、开合盖等所有关键场景的状态转换逻辑。

相关推荐
小七在进步14 分钟前
string的使用(1)
c++·visual studio
白杨尚青1 小时前
C++进阶篇(六):map 和 set 的模拟实现——用红黑树封装 mymap/myset(迭代器 + operator[])
开发语言·c++·迭代器·stl·set·map·红黑树
kloc4 小时前
聊天室项目入口网关子服务的实现
linux·c++
csdn_aspnet7 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
小七在进步8 小时前
string的使用(2)
c++
青少儿编程课堂9 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
wo_jack10 小时前
C++ 入门笔记(十七):list 入门 —— 为什么 list 不能 sort?
数据结构·c++·面试·stl·list
青少儿编程课堂12 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛
草莓熊Lotso12 小时前
【C++ 基于微服务的即时通讯系统】文件存储子服务实战:UUID生成、文件IO封装与全接口单元测试
开发语言·网络·数据库·c++·微服务·架构·单元测试
David猪大卫1 天前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习