Android WatchDog(4) - chien de garde(Android 12)

Dans le processus de démarrage de WatchDog , nous avons mentionné que lorsque WatchDog démarre, il démarrera le thread mThread nommé watchdog. Dans cette section, nous analysons la fonction d'exécution de ce thread, qui est également le dernier article de la série 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();
 }

Cette partie traversera la fonction planningCheckLocked de l'élément mHandlerCheckers. Cette fonction a été analysée en détail dans l'explication détaillée de Handler Checker et ne sera pas répétée ici.

                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);
                }

Cette section est relativement simple, elle n’attend en réalité que 30 secondes.

                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);
                }

Après 30 secondes, déterminez si un HandlerChecker est en retard. Si tel est le cas, les journaux pertinents seront collectés. Cette partie est relativement simple et ne sera pas détaillée.

Fin de ce chapitre.

おすすめ

転載: blog.csdn.net/weixin_41678668/article/details/122314173