1. 程式人生 > >Android系統服務之看門狗(WatchDog)

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