OH电源模块的基础知识介绍

社区官网电源资料电源模式定制开发指导

hidumper -s PowerManagerService -a -a 指令介绍

概述

本报告基于hidumper -s PowerManagerService -a -a命令输出的日志信息,对设备的电源管理状态进行全面分析。分析结果显示设备当前处于强制常亮状态,从未进入过休眠模式。

⚡️ 核心电源状态 (POWER STATE DUMP)

字段 (Field) 值 (Value) 详细解读
Current State AWAKE 当前状态:唤醒态。设备屏幕亮起,CPU 全速运行,用户可交互。
Reason 0 进入该状态的原因代码(0 通常指默认或用户操作)。
Time 26070 当前状态持续时间(毫秒),即已保持唤醒约 26 秒。
ScreenOffTime Timeout=-1ms 关键配置-1 表示永不息屏(即"不休眠"模式),通常由应用或设置强制指定。
OverrideTimeout 1800000ms 覆盖的超时时间设置,值为 1800 秒(30分钟)。

📜 详细状态历史 (DUMP DETAILS)

字段 (Field) 值 (Value) 详细解读
Last Screen On 3016123 上一次屏幕点亮的时间戳(系统启动后的相对时间)。
Last Screen Off 0 关键指标。值为 0 表示自系统启动以来,屏幕从未熄灭过
Last SuspendDevice 0 设备从未进入过挂起(深度睡眠)状态。
Last WakeupDevice 0 设备从未发生过从休眠中唤醒的动作。
Last Refresh 3016122 电源管理服务上一次刷新状态的时间戳。

🔄 状态机详情 (DUMP EACH STATES)

日志列出了所有支持的电源状态,除 AWAKE 外,其余状态均未激活。

状态 (State) 时间 (Time) 原因 (Reason) 解读
AWAKE 26070 INIT 当前活跃状态,由初始化触发。
FREEZE / INACTIVE 0 INIT 未进入过冻结或非活跃状态。
STAND_BY / DOZE 0 INIT 未进入过待机或打盹(浅睡眠)状态。
SLEEP / HIBERNATE 0 INIT 未进入过睡眠或休眠(深睡眠)状态。
DIM 0 INIT 未进入过屏幕变暗状态。

🔒 唤醒锁详情 (RUNNING LOCK DUMP)

这是导致设备不休眠的直接原因。当前共有 3 个活跃锁。

索引 类型 (Type) 锁名称 (Name) UID/PID 详细解读
1 BACKGROUND_TASK StandbyRunningLock... 1096/3784 后台任务锁。通常由系统服务持有,用于执行后台维护任务。
2 SCREEN PowerMgrKeepOnLock 5528/3990 屏幕常亮锁(关键)。这是导致屏幕强制亮起、不息屏的主要原因。通常由视频应用、导航或"开发者选项-保持唤醒"触发。
3 BACKGROUND_NOTIFICATION timeServiceRunning... 3819/3863 后台通知锁。用于处理后台通知或时间服务相关的任务。

📡 外设信息 (Peripherals Info)

字段 (Field) 值 (Value) 详细解读
Proximity (Enabled) 0 距离传感器功能当前未启用。
Proximity (Status) 0 传感器状态为 0(通常表示未检测到遮挡,即未贴近耳朵)。

📌 诊断总结

主要发现

  • 设备现状:设备处于强制常亮状态,从未休眠。
  • 根本原因:PID 为 3990 的进程持有了名为 PowerMgrKeepOnLockSCREEN 类型唤醒锁。

影响分析

  1. 电池消耗:由于屏幕被强制保持常亮,设备将比正常情况消耗更多电量。
  2. 设备温度:持续的CPU和屏幕活动可能导致设备温度升高。
  3. 用户体验:用户可能发现设备无法自动息屏,影响使用体验。

排查建议

  1. 检查应用:查找PID 3990对应的应用程序,可能是系统设置、视频播放器或桌面应用。
  2. 权限审查:确认该应用是否申请了"保持屏幕常亮"的权限。
  3. 用户设置:检查是否启用了"开发者选项"中的"保持屏幕常亮"功能。
  4. 应用行为:分析该应用为何需要保持屏幕常亮,是否存在优化空间。

解决方案

  • 临时解决:强制停止持有屏幕锁的应用进程。
  • 长期优化:修改应用代码,在不需要时及时释放屏幕唤醒锁。
  • 系统设置:调整电源管理设置,确保符合用户使用习惯。

附录:术语解释

电源状态说明

  • AWAKE:唤醒状态,设备完全可用
  • DOZE:打盹模式,轻度省电模式
  • SLEEP:睡眠模式,深度省电模式
  • HIBERNATE:休眠模式,最低功耗状态

唤醒锁类型

  • SCREEN:屏幕锁,防止屏幕熄灭
  • BACKGROUND_TASK:后台任务锁,执行后台操作
  • PROXIMITY_SCREEN_CONTROL:距离传感器锁

--

问题描述

XXX芯片在烧录后,重启电源在30秒左右息屏

基础情况

已经通过默认配置,将电源状态统一设置为永不息屏状态

问题分析

  1. 烧录后首次不会出现10秒钟息屏问题,重启后才会出现息屏说明是初始化后的应用&系统服务启动设置的
    首次烧录后通过指令查看当前的电源状态
    ```
    OHOS#hidumper -s PowerManagerService -a -a

-------------------------------[ability]-------------------------------

----------------------------------PowerManagerService----------------------------------
POWER STATE DUMP:
Current State: AWAKE Reason: 0 Time: 25277
ScreenOffTime: Timeout=-1ms
DUMP DETAILS:
Last Screen On: 219600
Last Screen Off: 0
Last SuspendDevice: 0
Last WakeupDevice: 0
Last Refresh: 219600
DUMP EACH STATES:
State: AWAKE Reason: INIT Time: 25277
Failure: INIT Reason: From: AWAKE Time: 0

State: FREEZE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: INACTIVE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: STAND_BY Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: DOZE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: SLEEP Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: HIBERNATE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: SHUTDOWN Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: DIM Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

RUNNING LOCK DUMP:
totalSize=3 validSize=0
Summary By Type:
SCREEN: 0
PROXIMITY_SCREEN_CONTROL: 0
BACKGROUND_PHONE: 0
RUNNINGLOCK_COORDINATION: 0
BACKGROUND_NOTIFICATION: 0
BACKGROUND_AUDIO: 0
BACKGROUND_SPORT: 0
BACKGROUND_NAVIGATION: 0
BACKGROUND_TASK: 0
BACKGROUND_USER_IDLE: 0
Dump Lock List:
index=1 time=206632 type=BACKGROUND_TASK name=StandbyRunningLock_21244 uid=1096 pid=3786 state=0
index=2 time=130608 type=BACKGROUND_NOTIFICATION name=timeServiceRunningLock_97279 uid=3819 pid=3872 state=0
index=3 time=202129 type=SCREEN name=PowerMgrKeepOnLock uid=5528 pid=4057 state=0
Dump Proxy List:
ProcessIndex=1 pid_uid=3786_1096 lock_cnt=1
lockIndex=1workSourceSize=0*proxyCount=0
ProcessIndex=2 pid_uid=3872_3819 lock_cnt=1
lockIndex=1workSourceSize=0
*
proxyCount=0
ProcessIndex=3 pid_uid=4057_5528 lock_cnt=1
lockIndex=1workSourceSize=0****proxyCount=0
Peripherals Info:
Proximity: Enabled=0 Status=0

当前状态系统电源模式为永不息屏状态。

2. 烧录后重启停在开机向导界面没有进入系统,不会出现30秒后自动息屏,打开设置后重启(设置有配置电源模式的选项),发现单板在10秒钟后息屏,使用指令查看异常状态下的电源状态。

PS C:\Users\tjw\Desktop> hdc shell
OHOS#hidumper -s PowerManagerService -a -a

-------------------------------[ability]-------------------------------

----------------------------------PowerManagerService----------------------------------
POWER STATE DUMP:
Current State: AWAKE Reason: 0 Time: 25575
ScreenOffTime: Timeout=30000ms
DUMP DETAILS:
Last Screen On: 25574
Last Screen Off: 0
Last SuspendDevice: 0
Last WakeupDevice: 0
Last Refresh: 0
DUMP EACH STATES:
State: AWAKE Reason: INIT Time: 25575
Failure: INIT Reason: From: AWAKE Time: 0

State: FREEZE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: INACTIVE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: STAND_BY Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: DOZE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: SLEEP Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: HIBERNATE Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: SHUTDOWN Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

State: DIM Reason: INIT Time: 0
Failure: INIT Reason: From: AWAKE Time: 0

RUNNING LOCK DUMP:
totalSize=2 validSize=0
Summary By Type:
SCREEN: 0
PROXIMITY_SCREEN_CONTROL: 0
BACKGROUND_PHONE: 0
RUNNINGLOCK_COORDINATION: 0
BACKGROUND_NOTIFICATION: 0
BACKGROUND_AUDIO: 0
BACKGROUND_SPORT: 0
BACKGROUND_NAVIGATION: 0
BACKGROUND_TASK: 0
BACKGROUND_USER_IDLE: 0
Dump Lock List:
index=1 time=6232 type=SCREEN name=PowerMgrKeepOnLock uid=1101 pid=0 state=0
index=2 time=10748 type=BACKGROUND_TASK name=StandbyRunningLock_21695 uid=1096 pid=3791 state=0
Dump Proxy List:
ProcessIndex=1 pid_uid=0_1101 lock_cnt=1
lockIndex=1workSourceSize=0*proxyCount=0
ProcessIndex=2 pid_uid=3791_1096 lock_cnt=1
lockIndex=1workSourceSize=0
*
proxyCount=0
Peripherals Info:
Proximity: Enabled=0 Status=0

通过此段信息可以当前的默认息屏时间已经改变30秒

通过上述两段基础信息的分析,可以得出默认配置未能生效,查看单板的默认配置信息,发现有两个配置文件,查看系统的配置文件

./system/etc/power_config/power_mode_config.xml
./vendor/etc/power_config/power_mode_config.xml

system/etc/power_config/power_mode_config.xml的配置文件内容为:
``` 由此可以发现产品仓库的电源配置文件未能生效 覆盖一下system/etc/power_config/power_mode_config.xml 查看效果 ``` mount -o rw,remount / cp -rf ./vendor/etc/power_config/power_mode_config.xml ./system/etc/power_config/power_mode_config.xml

rm -rf data

重启后执行复现步骤,问题未复现


## 查看源代码

namespace {
const std::string TAG_ROOT = "switch_policy";
const std::string POWER_MODE_CONFIG_PATH = "etc/power_config/power_mode_config.xml";
const std::string VENDOR_POWER_MODE_CONFIG_PATH = "/vendor/etc/power_config/power_mode_config.xml";
const std::string SYSTEM_POWER_MODE_CONFIG_PATH = "/system/etc/power_config/power_mode_config.xml";
constexpr uint32_t SLEEP_FILTER = SLEEP_FILTER_VALUE;
}

PowerSaveMode::PowerSaveMode()
{
POWER_HILOGD(FEATURE_POWER_MODE, "Start to parse power_mode_config.xml");

char buf[MAX_PATH_LEN];
char* path = GetOneCfgFile(POWER_MODE_CONFIG_PATH.c_str(), buf, MAX_PATH_LEN);
if (path != nullptr && *path != '\0') {
    if (!StartXMlParse(path)) {
        POWER_HILOGE(FEATURE_POWER_MODE, "policy config file power_mode_config.xml err");
    }
    return;
}

if (!StartXMlParse(VENDOR_POWER_MODE_CONFIG_PATH)) {
    POWER_HILOGI(FEATURE_POWER_MODE, "No vendor power_mode_config.xml, start to parse system config");
    StartXMlParse(SYSTEM_POWER_MODE_CONFIG_PATH);
}

}

通过查看源码可以看出,优先读取POWER_MODE_CONFIG_PATH 路径下的配置,hdc 连接上单板之后etc/power_config/power_mode_config.xml下的配置文件内容与/system/etc/power_config/power_mode_config.xml的相同,修改


Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐