Android系统服务之看门狗(WatchDog)

现在的CPU基本上都带有WatchDog功能,这种硬件的WatchDog可以在系统死掉(死锁或者程序跑飞)后重启系统,让系统回到可以工作的状态。WatchDog不能防止系统死掉,但是它能够起死回生,从而提高系统的可用性。

硬件级的WatchDog也有它的局限性,它只能在系统范围内生效,不能针对单个进程,某个进程死掉了,WatchDog未必知道。对于像Linux这类久经考验的操作系统来说,整个系统死掉概率非常低,所以此时硬件级的WatchDog意义反而不大。

Android 平台实现了一个软件的WatchDog来监护SystemServer。SystemServer无疑是Android平台中最重要的进程了,里面运行了整个平台中绝大多数的服务。在这个进程中运行着近50个线程,任何一个线程死掉都可能导致整个系统死掉。SystemServer退出反而问题不大,因为 init进程会重新启动它,但是它死锁就麻烦了,因为整个系统就没法动了。

 

Android WatchDog主要作用:

1)接收系统内部reboot请求,重启系统。

2)监护SystemServer进程,防止系统死锁。

 

Android Watchdog启动

Watchdog是在SystemServer进程中被初始化和启动的。在SystemServer 被Start时,各种Android服务被注册和启动,其中也包括了Watchdog的初始化和启动。代码如下:

Slog.i(TAG, "Init Watchdog");

Watchdog.getInstance().init(context, battery, power, alarm,

ActivityManagerService.self());

.在SystemServer Run函数的后半段,将检查系统是否已经准备好运行第三方代码,并通过SystemReady接口通知系统已经就绪。在ActivityManagerService的SystemReady接口的CallBack函数中实现Watchdog的启动

Watchdog.getInstance().start();

 

Watchdog使用方法

在 SystemServer里运行的服务中,最重要的几个服务应该数ActivityManager、WindowManager、 PowerManager 、InputManager、MountService(未启用)、NetworkManagementService。软件的WatchDog主要就是确保这几个服务发生死锁之后,退出SystemServer进程,让init进程重启它,让系统回到可用状态。

每个被监护的Service必须实现Watchdog.Monitor接口,这个接口只要实现一个函数monitor,这个函数实现非常简单,就拿ActivityManager来说:

public void monitor() {

  synchronized (this) { }

}

它去锁一下对象,什么也不做,然后就返回。如果对象没有死锁,这个过程就会很顺利。如果对象死锁了,这个函数就会挂在这里。

当然实现Watchdog.Monitor接口还不够,还要把它注册到WatchDog服务中,在初始化时加这样一行代码就行了:

Watchdog.getInstance().addMonitor(this);

 

Watchdog实现机制

WatchDog服务包括两个方面:

1.定期调用被监护对象的monitor函数,这是在主线程中完成的。如果被监护对象死锁,则会阻塞在这里。

final int size = mMonitors.size();

for (int i = 0 ; i < size ; i++) {

mCurrentMonitor = mMonitors.get(i);

mCurrentMonitor.monitor();

}

2.检测是否发生死锁,这是在Watchdog线程中运行的。如果发生死锁而且没有被调试,则退出SystemServer,init进程就会重启SystemServer进程。

if (!Debug.isDebuggerConnected()) {

Slog.w(TAG, "*** WATCHDOG KILLING SYSTEM PROCESS: " + name);

Process.killProcess(Process.myPid());

System.exit(10);

} else {

Slog.w(TAG, "Debugger connected: Watchdog is *not* killing the system process");

}

在前面提到的重要系统服务中,关键部分会用synchronized(this)锁住,例如ActivityManagerService:

startServiceLocked,handleApplicationError,appNotRespondingLocked等等

所以,有可能会出现,应用连续ANR或者崩溃,已经启动服务等操作交替出现的时候,超过了TIMEOUT定义的60s,Watchdog monitor在监视到服务持有的锁超过60s没有释放的情况下,认为SystemServer进程异常,强行退出SystemServer进程,由init进程重新启动SystemServer。

系统表现为,从开机动画处重新启动。

 

提供的问题定位方法:

1.ActivityManagerService.dumpStackTraces

2.dumpKernelStackTraces

你可能感兴趣的:(手机方案研发时的心得)