watchdog 即看门狗,用来监测系统是否发生了死锁,无响应等问题。要定时喂狗,不及时喂狗认为此时系统发生了blcok。
android系统的核心服务都跑在systemserver进程中,为了防止核心服务hang住而发生冻屏,systemserver中引入了Watchdog机制,当出现故障时,Watchdog触发杀死systemserver进程,实现软重启进行系统自恢复。
systemserver中的watchdog监测的对象主要分为两类,一个是对象锁,一个是线程的handler:
-
Monitor Checker,用于检查AMS, PKMS, WMS等系统服务的对象锁是否有长时间被持锁情况。Monitor Checker预警我们不能长时间持有核心系统服务的对象锁,否则会阻塞很多函数的运行;
-
Looper Checker,用于检查线程的消息队列是否长时间处于工作状态。Looper Checker预警我们不能长时间的霸占消息队列,否则其他消息将得不到处理。
watchdog原理:
systemsever在启动过程中初始化watchdog,启动watchdog线程。watchdog线程周期的(30s)给注册的handler发送runnable,30s内runnable执行返回,认为正常,runnable没有得到执行,出示黄牌警告,打印back tace。如果1分钟之内未得到执行,认为发生异常,出示红牌,打印backtrack,并杀死systemserver进程。Monitor Checker原理类似,运行在公共的fg线程中,30s未得到对象锁,黄牌警告,1分钟未得到对象锁红牌罚下。