平台环境
- OpenHarmony 版本:
4.1 release
- 开发板:
DAYU / RK3568
- 调试工具:
hdc
在使用 OpenHarmony 4.1 Release(矿鸿系统)进行开发时,遇到这样的问题:
🚨 Shell 会在一段时间后自动退出,严重影响调试和测试效率。
根本原因:系统息屏导致 shell 会话被关闭。
本文将从 修改系统配置、设置电源模式、替换配置文件、代码控制常亮 四种方法,讲解如何解决此问题。
一、修改源码实现全局不息屏
如果你正在编译自己的系统镜像(如 OHOS 源码构建),可以直接修改系统电源配置文件,实现在所有模式下“不息屏”。
修改路径:
base/powermgr/power_manager/services/native/profile/power_mode_config.xml
关键参数解释:
Switch ID | 功能说明 |
---|---|
101 | DisplayOffTime 息屏时间 |
102 | 系统自动睡眠时间 |
115 | 屏幕亮度 |
DisplayOffTime表示息屏的,因此只需要修改DisplayOffTime 对应的id:101即可
将 <switch id="101" value="xxx"/>
的 value
改为 -1
,即表示不设置息屏时间 = 永不息屏
修改示例:
<proxy id="600"> <!-- 正常模式 --><switch id="101" value="-1" recover_flag="0"/>...
</proxy>
建议你对所有模式(id 600~603)都设置 value="-1"
,这样即使切换电源模式,也不会息屏。
修改后的文件
<!--Power Mode Definitions: // 电源模式定义MODE_NORMAL = 600, // 正常模式MODE_POWER_SAVE = 601, // 省电模式MODE_PERFORMANCE = 602, // 性能优先MODE_EXTREME_POWER_SAVE = 603, // 超级省电
-->
<!--Action Definitions: // 行为定义DisplayOffTime = 101, // 息屏时间控制SystemAutoSleepTime = 102, // 系统自动睡眠时间控制AutoAdjustBrightness = 103, // 亮度自动调整时间控制AutoWindowRotation = 107, // 窗口自动旋转时间控制SystemBrightness = 115, // 系统亮度调节VibratorsState = 120, // 马达(震动)状态
-->
<switch_proxy version="1"><proxy id="600"><switch id="101" value="-1" recover_flag="0"/><switch id="102" value="0" recover_flag="0"/><switch id="103" value="-1" recover_flag="0"/><switch id="107" value="1" recover_flag="0"/><switch id="115" value="102" recover_flag="0"/><switch id="120" value="1" recover_flag="0"/></proxy><proxy id="601"><switch id="101" value="-1" recover_flag="0"/><switch id="102" value="5000" recover_flag="0"/><switch id="103" value="-1" recover_flag="0"/><switch id="107" value="-1" recover_flag="0"/><switch id="115" value="50" recover_flag="0"/><switch id="120" value="-1" recover_flag="0"/></proxy><proxy id="602"><switch id="101" value="-1" recover_flag="0"/><switch id="102" value="-1" recover_flag="0"/><switch id="103" value="-1" recover_flag="0"/><switch id="107" value="1" recover_flag="0"/><switch id="115" value="255" recover_flag="0"/><switch id="120" value="1" recover_flag="0"/></proxy><proxy id="603"><switch id="101" value="-1" recover_flag="0"/><switch id="102" value="1000" recover_flag="0"/><switch id="103" value="-1" recover_flag="0"/><switch id="107" value="-1" recover_flag="0"/><switch id="115" value="25" recover_flag="0"/><switch id="120" value="-1" recover_flag="0"/></proxy>
</switch_proxy>
二、通过命令行修改电源模式(临时方案)
如果你不想重编系统镜像,也可以临时修改电源模式,使其使用“性能优先模式”来避免息屏。
操作步骤:
# 进入 shell
hdc shell# 设置为性能优先模式
power-shell setmode 602
成功输出如下:
Set Mode: 602
Set Mode Success!
⚠️ 注意:该设置在系统重启后会恢复,需重新执行。
三、替换设备上的 power_mode_config.xml 文件(持久化方案)
若你无法编译系统但希望持久生效,可以将修改后的 XML 文件推送至设备 /vendor
目录。
步骤:
-
修改本地 XML 文件:
在power_mode_config.xml
中,将所有<switch id="101" value="xxx"/>
设置为-1
。 -
获取写权限:
hdc shell "mount -o remount,rw /"
- 准备目录(如不存在):
hdc shell
mount -o rw,remount /vendor
cd /vendor/etc
mkdir power_config
exit
- 推送 XML 文件:
hdc file send power_mode_config.xml /vendor/etc/power_config/
- 重启设备使其生效:
hdc shell reboot
修改生效后,无需每次开机都重新设置,除非你重新刷机覆盖了 vendor 分区。
四、应用内控制屏幕常亮(适用于 JS/TS 应用)
如果你只希望在当前应用运行时保持屏幕常亮,可在代码中调用 setWindowKeepScreenOn
。
示例代码(ArkTS):
private async keepScreenOn(status: boolean) {let context = getContext(this) as common.BaseContextlet windowClass = await window.getLastWindow(context)let isScreenOn = await windowClass.getWindowProperties().isKeepScreenOnif (!isScreenOn) {await windowClass.setWindowKeepScreenOn(status)}console.info("屏幕常亮状态:" + isScreenOn)
}
建议在页面生命周期中调用:
onPageShow() {this.keepScreenOn(true) // 页面显示时保持常亮
}onPageHide() {this.keepScreenOn(false) // 页面隐藏时取消
}