ANR-WatchDog

原   Android中ANR的监测与定位

余生颓废 提交于 2019-12-09 21:18:38
一、原理 1. ANR监测原理 判断ANR的方法其实很简单,我们在子线程里向主线程发消息,如果过了固定时间后,消息仍未处理,则说明已发生ANR了。 看懂了直接看2,没看懂继续看。 Android应用程序的所有交互操作和响应,都是通过主线程的消息机制来进行的。例如当用户点击了某个Button,系统会向主线程发送消息,主线程的Looper从主线程消息队列中取出消息并处理,处理完当前消息,主线程Looper再去取出下一个消息。当主线程做了耗时的任务,主线程的Looper就无法从消息队列中取出新的消息,所表现出的就是程序卡顿,甚至是ANR。同理,我们在子线程往主线程发送一个消息,要是消息无法得到及时处理,那说明程序发生ANR了。 2. 定位耗时操作的原理 当程序ANR后,我们可以通过主线程Looper拿到主线程Thread,然后通过getStackTrace拿到主线程当前的调用栈,从而定位到发生ANR的地方,定位到耗时操作。 二、代码实现 1. 首先我们定义一个线程,用来监测主线程。 在该线程中,我们首先给主线程发送消息,然后睡眠指定时间,之后监测消息是否被处理,若未被处理,则抛出ANR异常。 为什么叫ANRWatchDog:了解嵌入式的人对看门狗应该很熟悉,在嵌入式中,看门狗定时器在程序跑飞时,可定时复位程序,而我们必须定期喂狗(将定时器清零),表示程序正常运行。