Android WatchDog(4) - watchdog线程(Android 12)

WatchDog启动流程中我们讲到,WatchDog启动时会启动名为watchdog的mThread线程,本节我们分析该线程的run函数,也作为WatchDog系列的最后一篇。

long timeout = CHECK_INTERVAL;//30s
// Make sure we (re)spin the checkers that have become idle within
// this wait-and-check interval
for (int i=0; i<mHandlerCheckers.size(); i++) {
    
    
      HandlerChecker hc = mHandlerCheckers.get(i);
      // 这里会在新的线程执行,所以循环很快会出去
      hc.scheduleCheckLocked();
 }

这部分会遍历mHandlerCheckers元素的scheduleCheckLocked函数,Handler Checker详解中已经对该函数做过详细分析,这里不再赘述。

                long start = SystemClock.uptimeMillis();
                while (timeout > 0) {
    
    
                    if (Debug.isDebuggerConnected()) {
    
    
                        debuggerWasConnected = 2;
                    }
                    try {
    
    
                        mLock.wait(timeout);
                        // Note: mHandlerCheckers and mMonitorChecker may have changed after waiting
                    } catch (InterruptedException e) {
    
    
                        Log.wtf(TAG, e);
                    }
                    if (Debug.isDebuggerConnected()) {
    
    
                        debuggerWasConnected = 2;
                    }
                    timeout = CHECK_INTERVAL - (SystemClock.uptimeMillis() - start);
                }

这一段比较简单,其实就是wait 30秒。

                final int waitState = evaluateCheckerCompletionLocked();
                if (waitState == COMPLETED) {
    
    
                    // The monitors have returned; reset
                    waitedHalf = false;
                    continue;
                } else if (waitState == WAITING) {
    
    
                    // still waiting but within their configured intervals; back off and recheck
                    continue;
                } else if (waitState == WAITED_HALF) {
    
    
                    if (!waitedHalf) {
    
    
                        Slog.i(TAG, "WAITED_HALF");
                        waitedHalf = true;
                        // We've waited half, but we'd need to do the stack trace dump w/o the lock.
                        pids = new ArrayList<>(mInterestingJavaPids);
                        doWaitedHalfDump = true;
                    } else {
    
    
                        continue;
                    }
                } else {
    
    
                    // something is overdue!
                    blockedCheckers = getBlockedCheckersLocked();
                    subject = describeCheckersLocked(blockedCheckers);
                    allowRestart = mAllowRestart;
                    pids = new ArrayList<>(mInterestingJavaPids);
                }

30秒后判断是否有HandlerChecker处于overdue状态,如果有的话将收集相关日志,此部分较为简单不再详述。

本章完。

猜你喜欢

转载自blog.csdn.net/weixin_41678668/article/details/122314173