一:概念
Android WatchDog(看门狗)是Android系统中用于监控系统关键服务的运行状态的机制,其核心目标是检测系统服务是否因死锁、阻塞或异常导致长时间无响应,并在必要时触发系统恢复(如重启)。
二:核心功能
2.1 服务状态监控
定期检查关键系统服务(如ActivityManager、WindowManager等)是否正常响应,防止服务阻塞导致系统卡死。
2.2 超时处理
若某个服务未在规定时间内更新“心跳”(monitor),WatchDog判定为超时,触发后续处理流程。
2.3 日志收集与调试
超时发生时,自动收集系统堆栈信息(包括所有线程的调用栈),帮助定位问题根源。
2.4 系统恢复
在严重超时情况下,可能强制重启系统进程(system_server)或整个设备,避免用户长时间面对无响应界面。
三:实现逻辑
3.1 启动
WatchDog像系统服务一样,是由SystemServer启动的,具体启动逻辑如下
frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
...
//Watchdog对象的创建及线程的启动
t.traceBegin("StartWatchdog");
final Watchdog watchdog = Watchdog.getInstance();
watchdog.start();
mDumper.addDumpable(watchdog);
t.traceEnd();
...
//Watchdog初始化
t.traceBegin("InitWatchdog");
watchdog.init(mSystemContext, mActivityManagerService);
t.traceEnd();
...
}
3.2 初始化
- WatchDog运行在"watchdog"线程中
- "watchdog.monitor"后台线程,负责处理通过Handler发送的任务
- HandlerChecker一个与ServiceThread的Looper关联的Handler。这个Handler会将消息和任务发送到ServiceThread中执行,用于监控线程的响应性,确保线程正常运行
- 把"monitor thread"、"foreground thread"、"main thread"、"ui thread"、"i/o thread"、"display thread"、"animation thread"、"surface animation thread"等系统关键线程加入监控中
- 初始化Binder线程的监视器
frameworks/base/services/core/java/com/android/server/Watchdog.java
private Watchdog() {
//新建一个名为"watchdog"的线程
mThread = new Thread(this::run, "watchdog");
...
//启动一个名为"watchdog.monitor"的后台线程,负责处理通过Ha