一、概述
Android系统中,有硬件WatchDog用于定时检测关键硬件是否正常工作,类似地,在framework层有一个软件WatchDog用于定期检测关键系统服务是否发生死锁事件。WatchDog功能主要是分析系统核心服务和重要线程是否处于Blocked状态。
- 监视reboot广播;
- 监视mMonitors关键系统服务是否死锁。
二、启动流程
2.1 startOtherServices
[-> SystemServer.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
private void startOtherServices() { ... //创建watchdog【见小节2.2】 final Watchdog watchdog = Watchdog.getInstance(); //注册reboot广播【见小节2.3】 watchdog.init(context, mActivityManagerService); ... mSystemServiceManager.startBootPhase(SystemService.PHASE_LOCK_SETTINGS_READY); ... mActivityManagerService.systemReady(new Runnable() { @Override public void run() { mSystemServiceManager.startBootPhase( SystemService.PHASE_ACTIVITY_MANAGER_READY); ... // watchdog启动【见小节3.1】 Watchdog.getInstance().start(); mSystemServiceManager.startBootPhase( SystemService.PHASE_THIRD_PARTY_APPS_CAN_START); } } } |
2.2 getInstance
[-> Watchdog.java]
1 2 3 4 5 6 7 |
public static Watchdog getInstance() { if (sWatchdog == null) { //单例模式,创建实例对象【见小节2.2.1 】 sWatchdog = new Watchdog(); } return sWatchdog; } |
2.2.1 创建Watchdog
[-> Watchdog.java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public class Watchdog extends Thread { ... private Watchdog() { super("watchdog"); //【见小节2.2.2 】 mMonitorChecker = new HandlerChecker(FgThread.getHandler(), "foreground thread", DEFAULT_TIMEOUT); mHandlerCheckers.add(mMonitorChecker); mHandlerCheckers.add(new HandlerChecker(new Handler(Looper.getMainLooper()), "main thread", DEFAULT_TIMEOUT)); mHandlerCheckers.add(new HandlerChecker(UiThread.getHandler(), "ui thread", DEFAULT_TIMEOUT)); mHandlerCheckers.add(new HandlerChecker(IoThread.getHandler(), "i/o thread", DEFAULT_TIMEOUT)); mHandlerCheckers.add(new HandlerChecker(DisplayThread.getHandler(), "display thread", DEFAULT_TIMEOUT)); //【见小节2.2.3】 addMonitor(new BinderThreadMonitor()); } } |
Watchdog继承于Thread,创建的线程名为”watchdog”。mHandlerCheckers
是记录着所有的HandlerChecker对象的列表。
Watchdog监控的线程有:
线程名 | 对应handler | 含义 |
---|---|---|
main thread | new Handler(MainLooper) | 当前主线程 |
android.fg | FgThread.getHandler | 前台线程 |
android.ui | UiThread.getHandler | UI线程 |
android.io | IoThread.getHandler | I/O线程 |
android.display | DisplayThread.getHandler | Display线程 |
DEFAULT_TIMEOUT默认为60s
,调试时才为10s方便找出潜在的ANR问题。
2.2.2 HandlerChecker
[-> Watchdog.java]