Watchdog位于Framework的services包中,運行時由SystemServer初始化,從而運行在ServerThread中。
作用
Watchdog的主要作用是監(jiān)控SystemServer中一些服務(wù)是否發(fā)生了死鎖或者長時間被Blocked住而不能正常運行。
原理
定期調(diào)用被監(jiān)控者實現(xiàn)的Monitor接口的monitor()方法,等待一定時間(目前4.2上為30s)后檢查標識符,通過標識符來檢查被監(jiān)控者是否已經(jīng)處于異常狀態(tài)。
實現(xiàn)細節(jié)
- Watchdog會在兩個周期內(nèi)(目前4.2上為30s)都調(diào)用被監(jiān)控者的接口,同時檢查mCompleted的標識符;只有在連續(xù)兩個周期內(nèi)都有被監(jiān)控者不能正常返回時才會觸發(fā)后續(xù)操作,否則重置狀態(tài)繼續(xù)進行下一個周期。
- Watchdog發(fā)現(xiàn)被監(jiān)控者處于不正常狀態(tài)之后的操作便是殺死當前進程(也就是SystemServer進程,被殺死之后會導(dǎo)致zygote自殺,再之后由init進程重新創(chuàng)建zygote重新啟動Framework)。
- 過程中伴隨著日志和Stack Traces的輸出和寫入,具體參見代碼。