hiAppEvent监听崩溃,在应用发生CPP_CRASH、JS_CRASH、APP_FREEZE后便于监听相应的崩溃信息进行处理

在应用发生CPP_CRASH、JS_CRASH、APP_FREEZE后便于监听相应的崩溃信息进行处理

HarmonyOS
2024-05-28 21:10:29
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
躺平嗑产品懒猫

核心代码解释

使用hiAppEvent进行崩溃的监听,在应用崩溃之后,用户可以通过在次进入应用,进行崩溃信息的处理。在应用再次启动时会有个几十秒的等待时间处理。

核心代码如下:

添加应用崩溃事件观察者方法:

 hiAppEvent.addWatcher({ 
      // 开发者可以自定义观察者名称,系统会使用名称来标识不同的观察者 
      name: "watcher2", 
      // 开发者可以订阅感兴趣的系统事件,此处是订阅了崩溃事件 
      appEventFilters: [ 
        { 
          domain: hiAppEvent.domain.OS, 
          names: [hiAppEvent.event.APP_CRASH,hiAppEvent.event.APP_FREEZE] 
        } 
      ], 
      // 开发者可以自行实现订阅实时回调函数,以便对订阅获取到的事件数据进行自定义处理 
      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.eventType=${eventInfo.eventType}`); 
            // 开发者可以获取到崩溃事件发生的时间戳 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.time=${eventInfo.params['time']}`); 
            // 开发者可以获取到崩溃事件发生的崩溃类型 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.crash_type=${eventInfo.params['crash_type']}`); 
            // 开发者可以获取到崩溃应用的前后台状态 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.foreground=${eventInfo.params['foreground']}`); 
            // 开发者可以获取到崩溃应用的版本信息 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.bundle_version=${eventInfo.params['bundle_version']}`); 
            // 开发者可以获取到崩溃应用的包名 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.bundle_name=${eventInfo.params['bundle_name']}`); 
            // 开发者可以获取到崩溃应用的进程id 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.pid=${eventInfo.params['pid']}`); 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.uid=${eventInfo.params['uid']}`); 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.uuid=${eventInfo.params['uuid']}`); 
            // 开发者可以获取到崩溃事件发生的异常类型、异常原因和异常调用栈 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.exception=${JSON.stringify(eventInfo.params['exception'])}`); 
            // 开发者可以获取到崩溃事件发生时日志信息 
            hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.hilog.size=${eventInfo.params['hilog'].length}`); 
            console.log("testTag-----------------------------------------------------------------" + eventGroup.name.toString()) 
 
            if(eventGroup.name.toString() === 'APP_FREEZE'){ 
 
              console.log("testTag-----------------------------------------------------------------") 
 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.event_handler.size=${eventInfo.params['event_handler'].length}`); 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.event_handler_size_3s=${eventInfo.params['event_handler_size_3s']}`); 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.event_handler_size_6s=${eventInfo.params['event_handler_size_6s']}`); 
              // 开发者可以获取到卡死事件发生时同步binder调用信息 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.peer_binder.size=${eventInfo.params['peer_binder'].length}`); 
              // 开发者可以获取到卡死事件发生时全量线程调用栈 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.threads.size=${eventInfo.params['threads'].length}`); 
              // 开发者可以获取到卡死事件发生时内存信息 
              hilog.info(0x0000, 'testTag', `HiAppEvent eventInfo.params.memory=${JSON.stringify(eventInfo.params['memory'])}`); 
            } 
 
          } 
        } 
      } 
    });

崩溃模拟:

//QueryCrashDialog.ets 
  Button("app-Freeze").onClick(()=>{ 
          // 在按钮点击函数中构造一个freeze场景,触发应用卡死事件 
          setTimeout(() => { 
            while (true) {} 
          }, 1000) 
        }) 
 
 
        Button("js-Crash").onClick(()=>{ 
          // 在按钮点击函数中构造一个crash场景,触发应用崩溃事件 
          let result: object = JSON.parse(""); 
        }) 
 
 
        Button("Cpp-Crash").onClick(()=>{ 
          // 在按钮点击函数中构造一个crash场景,触发应用崩溃事件 
          hilog.info(0x0000, 'testTag', 'Test NAPI 2 + 3 = %{public}d', testNapi.add(2, 3)); 
        })

总结:

实现效果

注明适配的版本信息

  • IDE:DevEco    Studio 4.1.3.500
  • SDK:HarmoneyOS    4.0.10.11


分享
微博
QQ
微信
回复
2024-05-29 22:17:16
相关问题
HarmonyOS有防CPP crash具体方案吗
384浏览 • 1回复 待解决
使用hiappevent获取崩溃日志示例代码
1914浏览 • 1回复 待解决
尝试获取Har context,app crash
1865浏览 • 1回复 待解决
崩溃信息中缺少详细系统信息
865浏览 • 1回复 待解决
app启动crash报错Error message:MainPage:
1811浏览 • 1回复 待解决
如何实现crash堆栈抓取、crash回调
1850浏览 • 1回复 待解决
鸿蒙webview 崩溃怎么处理
6295浏览 • 1回复 待解决
HarmonyOS app Crash但是找不到错误原因
50浏览 • 1回复 待解决