【小源笔记】第十一期 | OpenHarmony应用保活之故障恢复 原创

Haoc_小源同学
发布于 2024-11-27 09:53
浏览
0收藏

@toc

简介

在某些业务场景中,我们希望应用能够持续保持运行状态。然而,长时间运行可能会引发一些不可预见的错误。如果这些异常未被有效处理,可能会导致应用崩溃并闪退。

OpenHarmony自API 9 Stage模型应用开始提供appRecovery接口,支持在监听到故障时进行进程重启以及数据恢复等能力。

接口说明

应用恢复接口功能介绍

接口名称 说明
enableAppRecovery(restart?: RestartFlag, saveOccasion?: SaveOccasionFlag, saveMode?: SaveModeFlag) : void;9+ 使能应用恢复功能,参数按顺序填入。该接口调用后,应用从启动器启动时第一个Ability支持恢复。
saveAppState(): boolean;9+ 主动保存当前应用中支持恢复的Ability的状态
restartApp(): void;9+ 重启当前进程,并启动由setRestartWant指定的Ability,如果未指定,将重新拉起处于前台且支持恢复的Ability。
saveAppState(context?: UIAbilityContext): boolean;10+ 主动保存由Context指定的Ability状态。
setRestartWant(want: Want): void;10+ 设置主动调用restartApp以及RestartFlag不为NO_RESTART时重启的Ability。该Ability必须在同一个包名下,且必须为UIAbility

由于上述接口可能在故障处理时使用,所以不会返回异常,需要开发者熟悉使用的场景。

enableAppRecovery: 需要在应用初始化阶段调用,比如AbilityStage的OnCreate调用。具体其各参数定义详见参数说明

saveAppState: 调用后框架会回调当前进程中所有支持恢复的Ability的onSaveState方法,如果在onSaveState方法中同意保存数据,则会将相关数据及Ability的页面栈持久化到应用的本地缓存。如果需要保存指定Ability,则需要指定Ability对应的Context。

setRestartWant: 指定由appRecovery发起重启的Ability

restartApp: 调用后框架会杀死当前应用进程,并重新拉起由setRestartWant指定的Ability,其中启动原因为APP_RECOVERY。API 9以及未使用setRestartWant指定Ability的场景,会拉起最后一个支持恢复且在前台的Ability,如果当前前台的Ability不支持恢复,则应用表现闪退。如果重启的Ability存在已经保存的状态,这些状态数据会在Ability的OnCreate生命周期回调的want参数中作为wantParam属性传入。两次重启的间隔应大于一分钟,一分钟之内重复调用此接口只会退出应用不会重启应用。自动重启的行为与主动重启一致。

应用故障管理接口支持场景

通常的故障类型有JS程序Crash、应用程序卡死、C++程序Crash。Crash故障时应用一般都会被关闭。Freeze故障为应用无响应卡屏场景。应用上层无需关注故障类型,底层恢复框架会根据故障类型来实现不同场景的故障管理。

故障名称 故障监听 状态保存 自动重启 日志查询
JS_CRASH 支持 支持 支持 支持
APP_FREEZE 不支持 支持 支持 支持
CPP_CRASH 不支持 不支持 不支持 支持

这里状态保存指的是故障时状态保存,对于应用卡死场景,开发者可以采用定时保存状态或者在Ability切入后台后自动保存的方式最大限度的保护用户数据。

开发步骤

使能开启自恢复特性

在应用模块初始化时使能appRecovery功能(这里必须在AbilityStage中进行使用,如果在UIAbility中并不生效,在hilog中可以看到AppRecovery not enabled.的打印)。

import { AbilityStage, appRecovery } from '@kit.AbilityKit';

export default class MyAbilityStage extends AbilityStage {
    onCreate() {
        console.info("[Demo] MyAbilityStage onCreate");
        appRecovery.enableAppRecovery(appRecovery.RestartFlag.ALWAYS_RESTART,
            appRecovery.SaveOccasionFlag.SAVE_WHEN_ERROR | appRecovery.SaveOccasionFlag.SAVE_WHEN_BACKGROUND,
            appRecovery.SaveModeFlag.SAVE_WITH_FILE);
    }
}

默认OpenHarmony的Empty Ability模板并没有MyAbilityStage.ets这个文件,可以自己手动创建并在module.json5配置文件中添加如下配置。

"module": {
  "name": "entry",
  "type": "entry",
  "description": "$string:module_desc",
  "srcEntry": "./ets/app/MyAbilityStage.ets", // 添加srcEntry字段
  "mainElement": "EntryAbility",
   ...
}

配置支持恢复的Ability

在需要支持恢复的Ability的module.json5配置文件中添加如下配置。

{
    "abilities": [
      {
        "name": "EntryAbility",
         ...
        "recoverable": true, // 添加recoverable字段
         ...
      }]
}

以上配置完成后,应用在监听到故障时即可自动恢复重启。对于业务上需要保存和恢复数据的,可以参考参考资料[1]。对于应用有更复杂的场景例如多Ability恢复的,可以参考相关实例

相关实例

参考资料

[1]应用恢复开发指导

【小源笔记】为笔者开发过程中的一些经验分享,旨在解决官方文档过于晦涩难懂或者示例代码不够详细的问题,同时方便笔者日后回顾以及其他开发者更快上手,欢迎评论留言~

往期推荐:

【小源笔记】第八期 | OpenHarmony编译Full-SDK
【小源笔记】第九期 | OpenHarmony自动化测试框架开发指南
【小源笔记】第十期 | OpenHarmony UiTest测试用例开发实践

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2024-11-27 09:53:18修改
2
收藏
回复
举报
2条回复
按时间正序
/
按时间倒序
ltkk12334
ltkk12334

1

2

4

回复
2024-11-27 17:09:33
ltkk12334
ltkk12334

1

额额我

回复
2024-11-28 16:01:44
回复
    相关推荐