鸿蒙 / 矿鸿系统 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 目录。

步骤:

  1. 修改本地 XML 文件:
    power_mode_config.xml 中,将所有 <switch id="101" value="xxx"/> 设置为 -1

  2. 获取写权限:

hdc shell "mount -o remount,rw /"
  1. 准备目录(如不存在):
hdc shell
mount -o rw,remount /vendor
cd /vendor/etc
mkdir power_config
exit
  1. 推送 XML 文件:
hdc file send power_mode_config.xml /vendor/etc/power_config/
  1. 重启设备使其生效:
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