WatchDog工作原理
[基于 Android P]
先看下MTK关于watchdog原理解释:
这个只是我们学习前的一个概论,具体代码详解如下。
1. SystemServer.startOtherServices
private void startOtherServices() {
final Context context = mSystemContext;
...
try{
...
traceBeginAndSlog("InitWatchdog");
//【2】实例化
final Watchdog watchdog = Watchdog.getInstance();
//【3】初始化
watchdog.init(context, mActivityManagerService);
traceEnd();
...
traceBeginAndSlog("StartWatchdog");
//【4】启动
Watchdog.getInstance().start();
traceEnd();
...
}catch (RuntimeException e) {
Slog.e("System", "******************************************");
Slog.e("System", "************ Failure starting core service", e);
}
...
}
Watchdog继承Thread类,使用单例模式实例化,调用自身init方法初始化。
2. Watchdog.getInstance
public static Watchdog getInstance() {
if (sWatchdog == null) {
sWatchdog = new Watchdog();
}
return sWatchdog;
}
实例化watchdog
2.1. Watchdog.Watchdog
private Watchdog() {
super("watchdog");
// 为我们要检查的每个公共线程初始化处理程序检查器。
// 请注意,我们当前没有检查后台线程,
// 因为它可能会保留更长时间的运行操作,
// 而不保证其中的操作的及时性。
// 添加android.fg线程监控
mMonitorChecker = new HandlerChecker(FgThread.getHandler(),
"foreground thread", DEFAULT_TIMEOUT);
mHandlerCheckers.add(mMonitorChecker);
// 添加 main 线程监控器
mHandlerCheckers.add(new HandlerChecker(new Handler(Looper.getMainLooper()),
"main thread", DEFAULT_TIMEOUT));
// 添加android.ui线程监控
mHandlerCheckers.add(new HandlerChecker(UiThread.getHandler(),
"ui thread", DEFAULT_TIMEOUT));
// 添加android.io线程监控
mHandlerCheckers.add(new HandlerChecker(IoThread.getHandler(),
"i/o thread", DEFAULT_TIMEOUT));
// 添加android.display线程监控
mHandlerCheckers.add(new HandlerChecker(DisplayThread.getHandler(),
"display thread", DEFAULT_TIMEOUT));
// 初始化binder线程监控
addMonitor(new BinderThreadMonitor());
// 加载fd 监控 open次数保存在/proc/self/fd/中
mOpenFdMonitor = OpenFdMonitor.create();
// See the notes on DEFAULT_TIMEOUT.
assert DB ||
DEFAULT_TIMEOUT > ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS;
}
3. Watchdog.init
public void init(Context context, ActivityManagerService activity) {
mResolver = context.getContentResolver();
mActivity = activity;
context.registerReceiver(new RebootRequestReceiver(),
new IntentFilter(Intent.ACTION_REBOOT),
android.Manifest.permission.REBOOT, null);
}