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