ANR-WatchDog-ohos

一个简单的监测程序,可检测到鸿蒙系统的 ANR(Application Not Response-应用程序无响应)错误并引发有意义的异常

项目名称:ANR-WatchDog-ohos

所属系列:鸿蒙的第三方组件适配移植

功能:可检测到鸿蒙系统的ANR错误并引发有意义的异常

项目移植状态:全部完成

调用差异:无

开发版本:sdk5,DevEco Studio2.1 beta3

项目作者和维护人:陈丛笑

目录

组件的意义

目前,ohos应用程序无法捕获和报告ANR错误。而调查ANR的唯一方法是提取文件/data/anr/traces.txt,不如选择我们自己的错误跟踪服务有效。

组件的功能

该组件设置了一个“watch dog”计时器,该计时器将检测UI线程何时停止响应。当监测到UI线程停止相应时,该组件会抛出一个具有堆栈轨迹的错误。

是否能和崩溃报告期一起使用

可以,由于这会引发错误,因此崩溃处理程序可以拦截该错误并按照所需的方式对其进行处理。

它是如何工作的

看门狗是一个简单的线程,它在循环中执行以下操作:

安排可运行对象尽快在UI线程上运行。

等待5秒钟。(默认值为5秒,但可以配置)。

查看可运行对象是否已运行。如果有,请返回1。

如果该可运行对象尚未运行,这意味着该UI线程已被阻塞至少5秒钟,则它将对所有正在运行的线程堆栈跟踪引发错误。

用法

安装

使用Devceo studio

在 app/build.gradle 中, 添加:

compile project(path: ':anr_watchdog')

在 AbilityPackage类的 onCreate中, 添加:

new ANRWatchDog().start();

阅读异常报告

该 ANRError 堆栈跟踪有点特殊, 它在你的应用程序运行的所有线程的堆栈跟踪。因此,在报告中, 每一个 caused by 部分都不是导致先例异常的原因, 而是不同线程的堆栈跟踪.

这是一个死锁示例:

鸿蒙手机的死锁示例:

2021-03-16 10:28:22.978 12535-12801/com.huawei.mytestapp E/AndroidRuntime: FATAL EXCEPTION: |ANR-WatchDog|

Process: com.huawei.mytestapp, PID: 12535

com.github.anrwatchdog.ANRError: Application Not Responding for at least 4000 ms.

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: main (state = BLOCKED)

at com.huawei.mytestapp.MainAbility.lock(MainAbility.java:83)

at com.huawei.mytestapp.MainAbility.access$500(MainAbility.java:15)

at com.huawei.mytestapp.MainAbility$8.onClick(MainAbility.java:170)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: AppEyeUiProbeThread (state = RUNNABLE)

at android.os.MessageQueue.nativePollOnce(Native Method)

at android.os.MessageQueue.next(MessageQueue.java:363)

at android.os.Looper.loop(Looper.java:176)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerDaemon (state = WAITING)

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:442)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:190)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:211)

at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:271)

从报告中,我们可以看到每一个线程的详细报告,根据Caused by 后面的堆栈追踪可以查看到死锁的原因

线程休眠报告:

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: AppEyeUiProbeThread (state = RUNNABLE)

at android.os.MessageQueue.nativePollOnce(Native Method)

at android.os.MessageQueue.next(MessageQueue.java:363)

at android.os.Looper.loop(Looper.java:176)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerDaemon (state = WAITING)

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:442)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:190)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:211)

at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:271)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: AppEyeUiProbeThread (state = RUNNABLE)

at android.os.MessageQueue.nativePollOnce(Native Method)

at android.os.MessageQueue.next(MessageQueue.java:363)

at android.os.Looper.loop(Looper.java:176)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerDaemon (state = WAITING)

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:442)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:190)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:211)

无限循环报告:

2021-03-16 14:48:45.471 29817-30409/com.huawei.mytestapp E/AndroidRuntime: FATAL EXCEPTION: |ANR-WatchDog|

Process: com.huawei.mytestapp, PID: 29817

com.github.anrwatchdog.ANRError: Application Not Responding for at least 4000 ms.

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: main (state = RUNNABLE)

at com.huawei.mytestapp.MainAbility.InfiniteLoop(MainAbility.java:33)

at com.huawei.mytestapp.MainAbility.access$400(MainAbility.java:15)

at com.huawei.mytestapp.MainAbility$7.onClick(MainAbility.java:164)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: AppEyeUiProbeThread (state = RUNNABLE)

at android.os.MessageQueue.nativePollOnce(Native Method)

at android.os.MessageQueue.next(MessageQueue.java:363)

at android.os.Looper.loop(Looper.java:176)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerDaemon (state = WAITING)

at java.lang.Object.wait(Native Method)

at java.lang.Object.wait(Object.java:442)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:190)

at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:211)

at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:271)

at java.lang.Daemons$Daemon.run(Daemons.java:137)

at java.lang.Thread.run(Thread.java:929)

Caused by: com.github.anrwatchdog.ANRError$$$_Thread: FinalizerWatchdogDaemon (state = TIMED_WAITING)

at java.lang.Thread.sleep(Native Method)

at java.lang.Thread.sleep(Thread.java:443)

at java.lang.Thread.sleep(Thread.java:359)

配置

超时

如何设置其他超时时间: ( 默认值为5000):

if (BuildConfig.DEBUG == false) {

new ANRWatchDog(10000 /*timeout*/).start();

}

调试

默认情况下,如果在进行debug或应用程序正在等待debug,watch-dog将忽略ANR。这是因为它将执行暂停和断点检测为ANR。要禁用此功能并在debug的情况下抛出ANRError,可以添加setIgnoreDebugger(true):

new ANRWatchDog().setIgnoreDebugger(true).start();

ANR回调

如果您不想在检测到ANR时不使应用程序崩溃,则可以启用回调:

new ANRWatchDog().setANRListener(new ANRWatchDog.ANRListener() {

@Override

public void onAppNotResponding(ANRError error) {

// Handle the error. For example, log it to HockeyApp:

ExceptionHandler.saveException(error, new CrashManager());

}

}).start();

在生产环境中交付应用程序时,这一点非常重要。

当由最终用户掌握时,最好不要在5秒后崩溃,而只需将ANR报告给您使用的任何报告系统即可。也许,再过几秒钟后,该应用程序将“解冻”。

Filtering reports

如果您希望仅在ANRError中报告自己的线程,而不是在所有线程(包括系统线程,例如该FinalizerDaemon线程)中报告所有线程,则可以设置前缀:仅报告名称以该前缀开头的线程。

new ANRWatchDog().setReportThreadNamePrefix("APP:").start();

然后,在启动线程时,请不要忘记将其名称设置为以该前缀开头的名称(如果要报告该名称):

public class MyAmazingThread extends Thread {

@Override

public void run() {

setName("APP: Amazing!");

/* ... do amazing things ... */

}

}

如果只想拥有主线程堆栈跟踪而没有其他所有线程,则可以:

new ANRWatchDog().setReportMainThreadOnly().start();

ANR Interceptor

有时,您想知道应用程序已经冻结了一段时间,但是还没有报告ANR错误。您可以定义在报告错误之前将被调用的拦截器。拦截器的作用是定义在给定的冻结持续时间下是否应提高或推迟ANR错误。

new ANRWatchDog(2000).setANRInterceptor(new ANRWatchDog.ANRInterceptor() {

@Override

public long intercept(long duration) {

long ret = 5000 - duration;

if (ret > 0) {

Log.w(TAG, "Intercepted ANR that is too short (" + duration + " ms), postponing for " + ret + " ms.");

}

return ret;

}

})

在此示例中,ANRWatchDog以2000毫秒的超时开始,但是拦截器将推迟错误,直到达到至少5000毫秒的冻结为止。

Watchdog thread

ANRWatchDog是一个线程,因此您可以随时中断它。

如果您正在使用Android的多进程功能进行编程(例如在新进程中启动活动),请记住,每个进程将需要ANRWatchDog线程。

Donate

鸿蒙系统测试失败,ANR-WatchDog-ohos: 一个简单的监测程序,可检测到鸿蒙系统的 ANR(Application Not Response-应用程序无响应)错误并引发有意义的异常...相关推荐

  1. java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署

    java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 java计算机毕业设计vue开发一个简单音乐播放器源码+mysql数据库+系统+lw文档+部署 本源码技 ...

  2. 一个简单、功能完整的WMS​仓库管理系统

    今天给大家推荐一个简单.功能完整的仓库管理系统. 项目简介 这是基于.NetCore 7.Vue 3开发的开源项目,支持中英文,界面简单清爽,采用前后端分离架构. 该项目主要是针对小型物流仓储供应链流 ...

  3. 安利一个简单快速好用的CMS建站系统

    铭飞CMS系统快速建站 铭飞CMS介绍 码云GVP开源项目:https://gitee.com/mingSoft/MCMS 铭飞官网:http://ms.mingsoft.net/ MCMS可以用来快 ...

  4. 自己早期写的一个简单上下班打卡统计工时的考勤系统【整理版】

    原本这个帖子,是由回复组成的,整个代码分布在各个回复里面,读者不好阅读,现在整个把它们放到正文,方便查看. 这是早期写的一个,仅仅是简单的考勤系统,大致功能是有的,但并未写的很牛叉,采用了文本来记录考 ...

  5. C语言学习笔记---一个简单的文件压缩示例

      通过一个简单的文件文件压缩例子,来学习文件操作的相关函数.该程序以只读的方式 "r" 打开第一个文件,以只写的方式"w"打开第二个文件.将第一个文件中每隔3 ...

  6. C++ 容器的综合应用的一个简单实例——文本查询程序

    [0. 需求] 最近在粗略学习<C++ Primer 4th>的容器内容,关联容器的章节末尾有个很不错的实例. 通过实现一个简单的文本查询程序,希望能够对C++的容器学习有更深的理解. 由 ...

  7. 运用HashMap和ArrayList打造一个简单的带文件的控制台学生管理系统(附上类及类方法的思维导图+控制台运行界面截图+源代码)

    文章目录: 一.本文由来 二.适合人群 三.类及类方法思维导图 四.控制台运行界面截图 五.项目源代码链接 六.后记 七.再回首 一.本文由来 今天是2020年1月23日.因为在2019年上半学期Ja ...

  8. 一个简单的学生成绩管理软件(ODBC开发)

    一个简单的学生成绩管理软件(ODBC开发) 下载本文所附源代码 程序运行效果截图: 前面我写过一篇<一个完善的ODBC数据库程序>,大家可能看到过,有鼓励,也有批评,但是所有这一切只有一个 ...

  9. 使用Python实现一个简单的接口服务

    使用Python实现一个简单的接口服务,可以通过get.post方法请求该接口,拿到响应数据.创建一个api_server.py文件,添加代码如下: import flask, json from f ...

最新文章

  1. Unity3D Adam Demo的学习与研究
  2. 广数系统u盘支持什么格式_支持转换50+种三维软件格式还能减面还是免费的,什么工具这么强大?...
  3. java blob转file_人工智能-Object Detection API 模型转tflite并验证
  4. DELL 控制卡做raid
  5. 前端学习(3036):vue+element今日头条管理-复习
  6. centOS restart xinetd
  7. Vue调试工具 vue-devtools的安装
  8. bzoj 1003: [ZJOI2006]物流运输
  9. Phpstorm-php在线手册配置
  10. 计算机考研各省份学校,想考研究生,哪个省份的高校更容易考上?
  11. 设置Win7自动关机的两种方法
  12. 计算机网络第七版--概述知识点总结
  13. 通俗易懂的哈希算法讲解
  14. 开课吧java广告,开课吧Java面试题:虚引用与软引用和弱引用的区别
  15. 循环的进阶:二重循环
  16. 《数据驱动 | 装备制造创新集群智慧化转型》
  17. Java零基础必看学习教程,Java开发环境配置详解
  18. 阿里云天池大赛赛题解析——机器学习篇 | 留言赠书
  19. 渗透测试-地基篇-美杜莎Medusa(十二)
  20. python下载文件保存_Python根据URL地址下载文件并保存至对应目录的实现

热门文章

  1. gtx1080 matlab,深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0
  2. 建立对象模型即使用UML画类图
  3. 数据挖掘:基于关联挖掘的商品销售分析
  4. 电脑配置单1(自用勿删)
  5. 硬盘 GPT转MBR格式
  6. 新版ChinaRen同学录
  7. SDWAN下半场:与恐龙同行
  8. Windows如何通过VNC访问Ubuntu远程桌面?
  9. mount不是很熟悉 转载文章了解下 转自http://forum.ubuntu.org.cn/viewtopic.php?f=120t=257333...
  10. 计算机网络:常见的计网面试题整理(一)