应用退出不知道原因?HarmonyOS有账本

0 评论 168 浏览 0 收藏 10 分钟

 在移动端应用开发过程中,可能出现应用闪退、后台被强制退出等异常行为。除崩溃、Freeze 等显性故障外,也存在系统资源调度引发的非故障类退出,仅依靠传统故障日志,无法完整还原退出现场,给问题排查带来较大阻碍。 针对这一痛点,HarmonyOS 6.1 上线 HiAppEvent 退出原因订阅能力,通过系统级事件采集,记录应用上一次应用退出的全量原因,助力开发者高效完成异常数据汇总与根因分析。下文将对该机制的原理、开发实践及应用场景展开详细解读。

本原创文章帖发布在华为开发者联盟社区,欢迎开发者前往访问评论交流,更多与该内容相关讨论,请点击原帖查看:

应用退出不知道原因?HarmonyOS有账本-华为开发者话题 | 华为开发者联盟

 在移动端应用开发过程中,可能出现应用闪退、后台被强制退出等异常行为。除崩溃、Freeze 等显性故障外,也存在系统资源调度引发的非故障类退出,仅依靠传统故障日志,无法完整还原退出现场,给问题排查带来较大阻碍。 针对这一痛点,HarmonyOS 6.1 上线 HiAppEvent 退出原因订阅能力,通过系统级事件采集,记录应用上一次应用退出的全量原因,助力开发者高效完成异常数据汇总与根因分析。下文将对该机制的原理、开发实践及应用场景展开详细解读。

一、背景与挑战

1.1 当前应用退出痛点

• 退出原因记录分散:系统杀应用逻辑分散在多个模块(如资源管控、故障处理、后台任务管理等),缺乏统一的维测接口。

• 区分退出是否是故障:部分退出原因是正常的用户行为,或者是系统正常的后台管理行为,需要剔除这些正常退出原因,关注消费产品使用者体验层面的异常问题。

1.2 常见退出场景分类

reason(string) 产生原因
LowMemoryKill 同前面的lastExitMessage值为Memory Pressure场景,即整机低内存触发,优先级由低到高终止应用。
IllegalAudioRendererBySuspend 应用的音频播放未申请合理的后台任务,其退至后台后仍有大量音频播放。
PowerSaveClean 整机切换到省电模式或应急模式。
RssThresholdKiller 应用的RSS内存超一定阈值。
UserRequest 最近任务上划或清理。
ThreadBlock6S 应用主线程卡死超时。
AppInputBlock 用户输入响应超时。
LifecycleTimeout 应用生命周期超时。
JsError js层程序崩溃。
CppCrash native层程序崩溃。
HighTemperature 温度超限。

二、通过HiAppEvent订阅机制获取上次退出原因

2.1 核心能力

• 订阅接口:hiAppEvent.addWatcher支持订阅hiAppEvent.event.APP_KILLED系统事件 。

• 数据模型:通过eventInfo.params.reason获取退出原因

2.2 开发实践示例

hiAppEvent.addWatcher({
  // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者
  name: "watcher",
  // 开发者可以订阅感兴趣的系统事件,此处是订阅了应用终止事件
  appEventFilters: [
    {
      domain: hiAppEvent.domain.OS,
      names: [hiAppEvent.event.APP_KILLED]
    }
  ],
  // 开发者可以自行实现订阅实时回调函数,以便对订阅获取到的事件数据进行自定义处理
  onReceive: (domain: string, appEventGroups: Array<hiAppEvent.AppEventGroup>) => {
    hilog.info(0x0000, 'testTag', `HiAppEvent onReceive: domain=${domain}`);
    for (const eventGroup of appEventGroups) {
      // 开发者可以根据事件集合中的事件名称区分不同的系统事件
      hilog.info(0x0000, 'testTag', `HiAppEvent eventName=${eventGroup.name}`);
      for (const eventInfo of eventGroup.appEventInfos) {
        // 开发者可以对事件集合中的事件数据进行自定义处理,此处是将事件数据打印在日志中
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.domain=${eventInfo.domain}`);
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.name=${eventInfo.name}`);
        // 开发者可以获取到应用终止事件发生的时间戳
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.time=${eventInfo.params['time']}`);
        // 开发者可以获取到应用的前后台状态
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.foreground=${eventInfo.params['foreground']}`);
        // 开发者可以获取到应用终止事件发生的原因
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.reason=${eventInfo.params['reason']}`);
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.app_running_unique_id=${eventInfo.params['app_running_unique_id']}`);
        hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.bundle_version=${eventInfo.params['bundle_version']}`);
      }
    }
  }
});

2.3 数据采集维度

名称 类型 说明
time number 事件触发时间,单位为ms。
reason string 终止原因,原因范围详见reason字段说明 
foreground boolean 应用是否处于前台状态。true表示应用处于前台;false表示应用处于后台。
app_running_unique_id string

应用运行时唯一关联的id。

说明:从API version 24开始支持该参数。

bundle_version string

应用版本信息。

说明:从API version 24开始支持该参数。

、开发案例:崩溃聚类分析实战

3.1 案例背景

       某应用在鸿蒙6.1升级后出现高频崩溃,传统日志分析难以定位共性诱因。通过HiAppEvent订阅机制,开发者获取到以下关键数据:

       • 崩溃类型分布:JS Crash占比62%,CppCrash占比38%。

• 资源管控诱因:整机内存管控触发的后台进程终止占比75%。

3.2 基本架构

3.3 聚类分析流程

1. 数据清洗提取eventInfo.params.reason中的关键词(如RssThresholdKiller、LowMemoryKill)。如果只关注前台应用闪退,则过滤eventInfo.params.foreground

2. 聚类算法:对崩溃事件reason进行聚类,识别高频模式。

3. 数据关联,根因定位:针对聚类中心事件,通过app_running_unique_id字段和hiAppEvent.event.APP_CRASH事件日志进行关联。

3.3 修复效果

修复措施 崩溃率下降幅度
优化内存分配策略 15%
修复Native Memory资源泄漏 28%
增加ErrorManger捕获不必要的JsError 35%

附:官方文档

1. 应用终止事件介绍,含订阅示例代码:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-killed-events

2. App Killed(应用终止)检测 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/appkilled-guidelines

3. 应用异常退出类问题检测方法 https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-runtime-exception-exit-detection

4. 应用被查杀类问题分析方法 https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-stability-app-killed-way

本文由 @华为开发者联盟 授权发布于人人都是产品经理。未经作者许可,禁止转载

题图来自Unsplash,基于CC0协议

该文观点仅代表作者本人,人人都是产品经理平台仅提供信息存储空间服务

更多精彩内容,请关注人人都是产品经理微信公众号或下载App
评论
评论请登录
  1. 目前还没评论,等你发挥!