前言
基于安卓平台的消息弹框组件ANR-WatchDog(https://github.com/SalomonBrys/ANR-WatchDog),实现鸿蒙化迁移和重构。代码已经开源到(https://gitee.com/isrc_ohos/anr-watch-dog-ohos),欢迎各位下载使用并提出宝贵意见!
背景
ANR-WatchDog-ohos是一个监测组件,可以监测鸿蒙应用的ANR(Application Not Response-应用程序无响应)错误,并能及时抛出异常。在此组件被移植成功之前,鸿蒙应用程序是无法捕获和报告ANR错误的,调查ANR的唯一方法是查看/data/anr/traces.txt文件。因此ANR-WatchDog-ohos为ANR捕获过程提供了更好的交互性、便捷性以及可视化的效果,同时也提升了程序的健壮性。
组件效果展示
1、组件应用的界面介绍
为了更好的向开发者展示组件的运行效果,先来了解一下组件应用中各按钮的含义。在图1中,蓝色框内是ANR的监测模式设置按钮,红色框内的是ANR模拟按钮。下面具体解释各按钮的含义:
- Min ANR duration:阻塞响应时间按钮。开发者通过点击按钮设置阻塞响应时间为2秒、4秒或6秒,即应用阻塞2秒、4秒或6秒后,执行特定的响应行为。
- Report mode:报告模式按钮。开发者通过点击按钮设置ANR发生时,HiLog中输出错误报告的模式:All Threads表示输出每个线程的错误日志;Main thread only 表示只输出主线程的错误日志;Filtered表示只输出符合特定过滤条件的线程的错误日志。
- Behaviour:响应行为按钮。开发者通过点击按钮设置ANR发生时应用的响应行为:Crash表示应用闪退;Silent表示开发者自定义应用的响应行为。
- Thread Sleep:可以模拟主线程休眠。
- Infinite loop:可以模拟主线程无限循环。
- Dead lock:可以模拟主线程死锁。
图1 ANR-WatchDog-ohos组件应用的界面介绍
2、组件运行效果展示
通过点击图1红色框内三个不同的按钮,可以看到三种不同的ANR发生时组件的运行效果。为了更清楚的展现检测模式的作用,我们给每个ANR模拟按钮设置不同的检测模式。下面对组件的运行效果进行详细描述:
1、线程休眠
ANR监测模式:阻塞响应时间为2秒,报告模式为All Threads、响应行为Crash。
点击Thread Sleep按钮,启动主线程休眠后,ANR-WatchDog-ohos组件监测到程序在2秒内一直无响应,于是触发应用闪退,并通过HiLog报告所有线程的ANR详情,其模式设置和执行效果如图2所示。
在报告中,可以根据“Caused by”后面的堆栈信息追踪查看线程休眠的具体原因,如图3所示。
图2 线程休眠设置流程和执行效果
图3 监测线程休眠后闪退输出的HiLog信息
2、线程无限循环
ANR监测模式:阻塞响应时间为4秒,报告模式为All Threads、响应行为Crash。
点击Infinite loop按钮,启动线程无限循环后,ANR-WatchDog-ohos组件监测到程序在4秒内一直无响应,于是触发应用闪退,并通过HiLog报告主线程的ANR错误详情,其监测模式设置和执行效果如图4所示,HiLog报告主线程的ANR详情如图5所示。
图4 线程无限循环设置流程和执行效果
图5 监测线程无限循环后闪退输出的HiLog信息
3、线程死锁
ANR监测模式:阻塞响应时间为6秒,报告模式为Filtered(只报告以“APP:”为前缀的线程)、响应行为Crash。
点击Dead lock按钮,启动线程死锁后,ANR-WatchDog-ohos组件监测到程序在6秒内一直无响应,于是触发应用闪退,并通过HiLog报告以“APP:”为前缀线程的ANR错误详情,其监测模式设置和执行效果如图6所示,HiLog报告主线程的ANR详情如图7所示。