鸿蒙 / 矿鸿系统 Shell 无故退出问题(息屏导致)详解
平台环境
- 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.BaseContext
let windowClass = await window.getLastWindow(context)
let isScreenOn = await windowClass.getWindowProperties().isKeepScreenOn
if (!isScreenOn) {
await windowClass.setWindowKeepScreenOn(status)
}
console.info("屏幕常亮状态:" + isScreenOn)
}
建议在页面生命周期中调用:
onPageShow() {
this.keepScreenOn(true) // 页面显示时保持常亮
}
onPageHide() {
this.keepScreenOn(false) // 页面隐藏时取消
}
THE END