精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Watchdog機制源碼分析

移動開發 Android
Android設計了一個軟件層面Watchdog,用于保護一些重要的系統服務,當出現故障時,通常會讓Android系統重啟,由于這種機制的存在,就經常會出現一些system_server進程被Watchdog殺掉而發生手機重啟的問題.

[[434595]]

前言

Linux引入Watchdog,在Linux內核下,當Watchdog啟動后,便設定了一個定時器,如果在超時時間內沒有對/dev/Watchdog進行寫操作,則會導致系統重啟。通過定時器實現的Watchdog屬于軟件層面;

Android設計了一個軟件層面Watchdog,用于保護一些重要的系統服務,當出現故障時,通常會讓Android系統重啟,由于這種機制的存在,就經常會出現一些system_server進程被Watchdog殺掉而發生手機重啟的問題;

今天我們就來分析下原理;

一、WatchDog啟動機制詳解

ANR機制是針對應用的,對于系統進程來說,如果長時間“無響應”,Android系統設計了WatchDog機制來管控。如果超過了“無響應”的延時,那么系統WatchDog會觸發自殺機制;

Watchdog是一個線程,繼承于Thread,在SystemServer.java里面通過getInstance獲取watchdog的對象;

1、在SystemServer.java中啟動

  1. private void startOtherServices() { 
  2.     ······ 
  3.     traceBeginAndSlog("InitWatchdog"); 
  4.     final Watchdog watchdog = Watchdog.getInstance(); 
  5.     watchdog.init(context, mActivityManagerService); 
  6.     traceEnd(); 
  7.     ······ 
  8.     traceBeginAndSlog("StartWatchdog"); 
  9.     Watchdog.getInstance().start(); 
  10.    traceEnd(); 

因為是線程,所以,只要start即可;

2、查看WatchDog的構造方法

  1. private Watchdog() { 
  2.         super("watchdog"); 
  3.         // Initialize handler checkers for each common thread we want to check.  Note 
  4.         // that we are not currently checking the background thread, since it can 
  5.         // potentially hold longer running operations with no guarantees about the timeliness 
  6.         // of operations there. 
  7.         // The shared foreground thread is the main checker.  It is where we 
  8.         // will also dispatch monitor checks and do other work
  9.         mMonitorChecker = new HandlerChecker(FgThread.getHandler(), 
  10.                 "foreground thread", DEFAULT_TIMEOUT); 
  11.         mHandlerCheckers.add(mMonitorChecker); 
  12.         // Add checker for main thread.  We only do a quick check since there 
  13.         // can be UI running on the thread. 
  14.         mHandlerCheckers.add(new HandlerChecker(new Handler(Looper.getMainLooper()), 
  15.                 "main thread", DEFAULT_TIMEOUT)); 
  16.         // Add checker for shared UI thread. 
  17.         mHandlerCheckers.add(new HandlerChecker(UiThread.getHandler(), 
  18.                 "ui thread", DEFAULT_TIMEOUT)); 
  19.         // And also check IO thread. 
  20.         mHandlerCheckers.add(new HandlerChecker(IoThread.getHandler(), 
  21.                 "i/o thread", DEFAULT_TIMEOUT)); 
  22.         // And the display thread. 
  23.         mHandlerCheckers.add(new HandlerChecker(DisplayThread.getHandler(), 
  24.                 "display thread", DEFAULT_TIMEOUT)); 
  25.         // Initialize monitor for Binder threads. 
  26.         addMonitor(new BinderThreadMonitor()); 
  27.         mOpenFdMonitor = OpenFdMonitor.create(); 
  28.         // See the notes on DEFAULT_TIMEOUT. 
  29.         assert DB || 
  30.                 DEFAULT_TIMEOUT > ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS; 
  31.         // mtk enhance 
  32.         exceptionHWT = new ExceptionLog(); 
  33.     } 

重點關注兩個對象:mMonitorChecker和mHandlerCheckers

mHandlerCheckers列表元素的來源:

構造對象的導入:UiThread、IoThread、DisplatyThread、FgThread加入

外部導入:Watchdog.getInstance().addThread(handler);

mMonitorChecker列表元素的來源:

外部導入:Watchdog.getInstance().addMonitor(monitor);

特別說明:addMonitor(new BinderThreadMonitor());

3、查看WatchDog的run方法

  1. public void run() { 
  2.         boolean waitedHalf = false
  3.         boolean mSFHang = false
  4.         while (true) { 
  5.             ······ 
  6.             synchronized (this) { 
  7.                 ······ 
  8.                 for (int i=0; i<mHandlerCheckers.size(); i++) { 
  9.                     HandlerChecker hc = mHandlerCheckers.get(i); 
  10.                     hc.scheduleCheckLocked(); 
  11.                 } 
  12.                 ······ 
  13.             } 
  14.             ······ 

對mHandlerCheckers列表元素進行檢測;

4、查看HandlerChecker的scheduleCheckLocked

  1. public void scheduleCheckLocked() { 
  2.         if (mMonitors.size() == 0 && mHandler.getLooper().getQueue().isPolling()) { 
  3.                 // If the target looper has recently been polling, then 
  4.                 // there is no reason to enqueue our checker on it since that 
  5.                 // is as good as it not being deadlocked.  This avoid having 
  6.                 // to do a context switch to check the thread.  Note that we 
  7.                 // only do this if mCheckReboot is false and we have no 
  8.                 // monitors, since those would need to be executed at this point. 
  9.                 mCompleted = true
  10.                 return
  11.         } 
  12.         if (!mCompleted) { 
  13.                 // we already have a check in flight, so no need 
  14.                 return
  15.         } 
  16.         mCompleted = false
  17.         mCurrentMonitor = null
  18.         mStartTime = SystemClock.uptimeMillis(); 
  19.         mHandler.postAtFrontOfQueue(this); 

mMonitors.size() == 0的情況:主要為了檢查mHandlerCheckers中的元素是否超時,運用的手段:mHandler.getLooper().getQueue().isPolling();

mMonitorChecker對象的列表元素一定是大于0,此時,關注點在mHandler.postAtFrontOfQueue(this);

  1. public void run() { 
  2.        final int size = mMonitors.size(); 
  3.        for (int i = 0 ; i < size ; i++) { 
  4.             synchronized (Watchdog.this) { 
  5.                 mCurrentMonitor = mMonitors.get(i); 
  6.             } 
  7.             mCurrentMonitor.monitor(); 
  8.        } 
  9.        synchronized (Watchdog.this) { 
  10.             mCompleted = true
  11.             mCurrentMonitor = null
  12.        } 

監聽monitor方法,這里是對mMonitors進行monitor,而能夠滿足條件的只有:mMonitorChecker,例如:各種服務通過addMonitor加入列表;

  1. ActivityManagerService.java 
  2.     Watchdog.getInstance().addMonitor(this);  
  3. InputManagerService.java 
  4.     Watchdog.getInstance().addMonitor(this);  
  5. PowerManagerService.java 
  6.     Watchdog.getInstance().addMonitor(this);  
  7. ActivityManagerService.java 
  8.     Watchdog.getInstance().addMonitor(this);  
  9. WindowManagerService.java 
  10.     Watchdog.getInstance().addMonitor(this); 

而被執行的monitor方法很簡單,例如ActivityManagerService:

  1. public void monitor() { 
  2.      synchronized (this) { } 

這里僅僅是檢查系統服務是否被鎖住;

Watchdog的內部類;

  1. private static final class BinderThreadMonitor implements Watchdog.Monitor { 
  2.         @Override 
  3.         public void monitor() { 
  4.             Binder.blockUntilThreadAvailable(); 
  5.         } 
  6. android.os.Binder.java 
  7. public static final native void blockUntilThreadAvailable(); 
  8. android_util_Binder.cpp 
  9. static void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject clazz) 
  10.     return IPCThreadState::self()->blockUntilThreadAvailable(); 
  11. IPCThreadState.cpp 
  12. void IPCThreadState::blockUntilThreadAvailable() 
  13.     pthread_mutex_lock(&mProcess->mThreadCountLock); 
  14.     while (mProcess->mExecutingThreadsCount >= mProcess->mMaxThreads) { 
  15.         ALOGW("Waiting for thread to be free. mExecutingThreadsCount=%lu mMaxThreads=%lu\n"
  16.                 static_cast<unsigned long>(mProcess->mExecutingThreadsCount), 
  17.                 static_cast<unsigned long>(mProcess->mMaxThreads)); 
  18.         pthread_cond_wait(&mProcess->mThreadCountDecrement, &mProcess->mThreadCountLock); 
  19.     } 
  20.     pthread_mutex_unlock(&mProcess->mThreadCountLock); 

這里僅僅是檢查進程中包含的可執行線程的數量不能超過mMaxThreads,如果超過了最大值(31個),就需要等待;

  1. ProcessState.cpp 
  2. #define DEFAULT_MAX_BINDER_THREADS 15 
  3. 但是systemserver.java進行了設置 
  4. // maximum number of binder threads used for system_server 
  5. // will be higher than the system default 
  6. private static final int sMaxBinderThreads = 31; 
  7. private void run() { 
  8.     ······ 
  9.     BinderInternal.setMaxThreads(sMaxBinderThreads); 
  10.     ······ 

5、發生超時后退出

  1. public void run() { 
  2.     ······ 
  3.     Process.killProcess(Process.myPid()); 
  4.     System.exit(10); 
  5.     ······ 

kill自己所在進程(system_server),并退出;

二、原理解釋

1、系統中所有需要監控的服務都調用Watchdog的addMonitor添加Monitor Checker到mMonitors這個List中或者addThread方法添加Looper Checker到mHandlerCheckers這個List中;

2、當Watchdog線程啟動后,便開始無限循環,它的run方法就開始執行;

  • 第一步調用HandlerChecker#scheduleCheckLocked處理所有的mHandlerCheckers
  • 第二步定期檢查是否超時,每一次檢查的間隔時間由CHECK_INTERVAL常量設定,為30秒,每一次檢查都會調用evaluateCheckerCompletionLocked()方法來評估一下HandlerChecker的完成狀態:
  • COMPLETED表示已經完成;
  • WAITING和WAITED_HALF表示還在等待,但未超時,WAITED_HALF時候會dump一次trace.
  • OVERDUE表示已經超時。默認情況下,timeout是1分鐘;

3、如果超時時間到了,還有HandlerChecker處于未完成的狀態(OVERDUE),則通過getBlockedCheckersLocked()方法,獲取阻塞的HandlerChecker,生成一些描述信息,保存日志,包括一些運行時的堆棧信息。

4、最后殺死SystemServer進程;

總結

Watchdog是一個線程,用來監聽系統各項服務是否正常運行,沒有發生死鎖;

HandlerChecker用來檢查Handler以及monitor;

monitor通過鎖來判斷是否死鎖;

超時30秒會輸出log,超時60秒會重啟;

Watchdog會殺掉自己的進程,也就是此時system_server進程id會變化;

本文轉載自微信公眾號「Android開發編程」

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2012-05-31 02:54:07

HadoopJava

2021-12-06 14:52:08

動畫Android補間動畫

2024-08-30 10:40:12

2023-08-28 07:49:24

Redisson鎖機制源碼

2021-03-16 21:45:59

Python Resize機制

2020-05-26 18:50:46

JVMAttachJava

2023-06-15 14:09:00

解析器Servlet容器

2014-08-26 11:11:57

AsyncHttpCl源碼分析

2011-03-15 11:33:18

iptables

2025-09-08 02:35:00

Redisson分布式鎖WatchDog

2011-06-23 13:10:39

Python 對象機制

2024-09-06 09:37:45

WebApp類加載器Web 應用

2023-10-31 16:00:51

類加載機制Java

2014-07-18 11:11:16

SEAndroid

2011-08-24 16:59:59

LuaModule

2011-05-26 10:05:48

MongoDB

2021-08-12 16:28:10

AndroidHandleLooper

2011-05-26 16:18:51

Mongodb

2011-06-23 14:40:13

Qt 信號

2009-06-18 14:51:12

Hibernate緩存Hibernate
點贊
收藏

51CTO技術棧公眾號

欧美日韩免费高清一区色橹橹| 国产精品资源网| 亚洲视频综合网| 久久撸在线视频| 超碰caoporn久久| 国产成人在线电影| 77777少妇光屁股久久一区| 久久成人激情视频| 国产日韩在线观看视频| 欧美三级xxx| 一区二区精品在线观看| 欧美一级片免费| 日本最新不卡在线| 久久久久北条麻妃免费看| 男人网站在线观看| 亚洲精品69| 欧美性感美女h网站在线观看免费| 日韩偷拍一区二区| 国产又粗又大又爽视频| 亚洲尤物精选| 久久久久久亚洲精品| 神马久久久久久久久久久| 粉嫩一区二区三区四区公司1| 无码国产精品一区二区免费16| 欧美国产高清| 国产亚洲精品日韩| 国产精品一区二区人妻喷水| 亚洲精品三区| 91福利在线导航| 免费毛片网站在线观看| 巨大荫蒂视频欧美大片| 国产亚洲欧美色| 国内精品二区| 精品人妻一区二区三区浪潮在线| 蜜臀久久99精品久久久久久9| 2018中文字幕一区二区三区| 青娱乐国产在线视频| 日韩精品一卡| 亚洲小视频在线观看| 手机在线成人av| 综合中文字幕| 日韩美女一区二区三区| 一二三级黄色片| 粉嫩av一区二区三区四区五区 | 国产在线一区二区三区播放| 国产福利视频导航| 国产一区二区三区观看| 91人人爽人人爽人人精88v| 中文字幕乱码人妻无码久久| 久久这里只有| 99久免费精品视频在线观看| 日韩在线观看网站| 国产熟女一区二区| 色综合综合网| 亚洲美女在线视频| 激情综合丁香五月| 欧美成人专区| 亚洲国产一区自拍| 51调教丨国产调教视频| 网友自拍一区| 大型av综合网站| 欧美日韩在线看| 狠狠97人人婷婷五月| 91高清视频在线观看| 亚洲一本大道在线| 成人在线国产视频| 9765激情中文在线| 欧美性jizz18性欧美| 日本黄色三级大片| 88xx成人网| 欧美日韩美女一区二区| 亚洲免费在线播放视频| 久久av网站| 精品国内二区三区| 黄色短视频在线观看| 国产亚洲一区二区三区啪| 亚洲午夜久久久久久久| 久久噜噜色综合一区二区| 亚洲天堂免费| 久久久久久久爱| 日韩 欧美 精品| 久久久精品网| 91日本在线观看| 日本黄色大片视频| 久久久国际精品| 正在播放91九色| 国内高清免费在线视频| 日韩欧美高清在线视频| 一区二区三区 欧美| 日本亚州欧洲精品不卡| 日韩精品在线电影| 99热在线观看精品| 影音先锋一区| 国产精品激情av在线播放| 91亚洲欧美激情| 97精品久久久午夜一区二区三区 | 狠狠操狠狠干视频| 中文字幕一区二区三区中文字幕| 亚洲精品日韩欧美| 日韩激情小视频| 韩国自拍一区| 国产精品av免费在线观看| 99热这里只有精品在线观看| 久久尤物电影视频在线观看| 中文字幕av导航| 在线男人天堂| 日韩午夜在线播放| 国产成人无码精品久久二区三| 国产精品久久久久久影院8一贰佰| 久久久久久久国产精品视频| 中文在线观看av| a在线欧美一区| 中文字幕中文字幕在线中心一区| 神马久久午夜| 日韩一区二区三区四区五区六区| 最新中文字幕av| 国产精品自产拍| 免费人成黄页网站在线一区二区| 国产精品二区二区三区| 无遮挡动作视频在线观看免费入口| 性做久久久久久久免费看| 精品国产精品自拍| 免费人成在线观看视频播放| 国产亚洲精品av| 亚欧在线免费观看| 国产精品久久久久久久小唯西川| 亚洲男人的天堂在线播放| 农民人伦一区二区三区| 日韩制服一区| 亚洲精品一区二三区不卡| 日本视频一区二区在线观看| 天天操天天操天天| 亚洲精品日产精品乱码不卡| 国产天堂在线播放| 免费成人三级| 欧美韩国理论所午夜片917电影| 亚洲一卡二卡在线观看| 久久一留热品黄| 欧美日韩性生活片| 成人性生交大片免费看96| 久久精品人人爽| 一卡二卡在线视频| 国产精品三级视频| 九九九在线观看视频| 猛男gaygay欧美视频| 欧美一级在线亚洲天堂| 无套内谢的新婚少妇国语播放| 亚洲综合色噜噜狠狠| 日本高清免费观看| 综合久久婷婷| 超碰97在线人人| 黄色成人在线网| 亚洲成人久久网| 精品人妻在线播放| 成人丝袜高跟foot| av日韩一区二区三区| 欧美黄色录像| 国产a∨精品一区二区三区不卡| 女人偷人在线视频| 欧美亚洲免费在线一区| 亚洲不卡的av| 国内精品伊人久久久久av一坑| 国产成年人在线观看| 国产精品亚洲欧美一级在线| 久热精品视频在线观看| 精品国产乱码一区二区三| 亚洲线精品一区二区三区 | 丝袜亚洲另类欧美| 日韩欧美在线观看强乱免费| 91九色综合| 久久久精品久久| 亚洲AV无码一区二区三区少妇 | 亚洲精品www久久久久久| 26uuu国产在线精品一区二区| 老司机午夜av| 99视频精品视频高清免费| 亚洲一区二区三区sesese| 欧洲黄色一区| 亚洲欧美在线免费| 中文字幕有码视频| 亚洲精选视频免费看| 少妇精品无码一区二区三区| 久久精品一区| 四虎永久免费网站| 精品网站aaa| 亚洲精品一区二区三区精华液| 91精品办公室少妇高潮对白| 亚洲成人av片在线观看| 亚洲国产无码精品| 日本特黄久久久高潮| 综合久久国产| 国内精品国产成人国产三级粉色| 热久久99这里有精品| 色的视频在线免费看| 精品久久久久久最新网址| 性无码专区无码| 亚洲欧美日韩电影| www.超碰97| 精品亚洲国产成人av制服丝袜| 欧美午夜小视频| 久久高清免费| 九九九热999| aa亚洲一区一区三区| 97超级碰碰人国产在线观看| 免费在线午夜视频| 日韩国产中文字幕| av中文字幕免费| 色噜噜久久综合| 国产精品99无码一区二区| 中文字幕第一区二区| 洋洋av久久久久久久一区| 亚洲区 欧美区| 日韩中文字幕1| 农民人伦一区二区三区| 91亚洲国产成人久久精品| 久久精品国产精品青草色艺| 欧美中文高清| 国产精品偷伦视频免费观看国产| 神马久久午夜| 久久久久久久久久久亚洲| 久热国产在线| 在线日韩欧美视频| 邻家有女韩剧在线观看国语| 精品区一区二区| 中文字幕男人天堂| 大香伊人久久| 在线日本欧美| 欧美一级日韩免费不卡| 7799精品视频天天看| 亚洲第一狼人社区| 91高清免费看| 国产精品国产三级国产| 国产精品无码久久久久一区二区| 成人精品免费视频| 精品国产aⅴ一区二区三区东京热| 久久精品国产精品亚洲精品| 黄色免费网址大全| 老牛国产精品一区的观看方式| 国产欧美日韩网站| 激情另类综合| 国产精品自拍合集| 欧美天堂亚洲电影院在线观看| 一区二区三区电影| 成人a'v在线播放| 日韩高清国产精品| 激情综合网站| 日韩免费三级| 欧美精品久久久久久 | www.豆豆成人网.com| 亚洲自拍av在线| 日韩中文字幕无砖| 成人黄色片视频网站| 999久久久久久久久6666| 亚洲免费影视| 999精品在线观看| 亚洲综合色婷婷在线观看| 97人人香蕉| 国产伦精品一区二区三区在线播放| 国产日韩欧美精品| 日韩精品欧美大片| 欧美一级二级三级| 精品久久美女| 天堂v在线视频| 欧美日韩理论| 国产在线播放观看| 久久国产毛片| gogogo高清免费观看在线视频| 狠狠v欧美v日韩v亚洲ⅴ| 中文字幕55页| av中文字幕亚洲| 女女互磨互喷水高潮les呻吟| 中文字幕av一区二区三区高| 国产稀缺精品盗摄盗拍| 一区二区三区日韩| 91午夜视频在线观看| 欧美伊人精品成人久久综合97| 在线免费观看一级片| 日韩精品一区二区三区在线观看 | 99久久精品费精品国产一区二区| 国产在线观看无码免费视频| 国产女主播一区| 91嫩草丨国产丨精品| 午夜一区二区三区在线观看| 日本黄色一级视频| 91精品国产色综合久久ai换脸 | 成人综合婷婷国产精品久久免费| av无码一区二区三区| 国产免费观看久久| 午夜少妇久久久久久久久| 欧美日韩在线视频观看| 糖心vlog精品一区二区| 日韩精品最新网址| 久久久久久久影视| 欧美超级乱淫片喷水| 午夜伦理福利在线| 成人免费在线视频网站| 日韩激情毛片| 国产精品啪啪啪视频| 久久午夜电影| 国产国语老龄妇女a片| 国产午夜亚洲精品不卡| 欧美三级在线免费观看| 在线视频综合导航| 色一情一乱一区二区三区| 色噜噜狠狠色综合网图区| 欧美一级鲁丝片| 亚洲综合在线中文字幕| 天堂在线观看av| 国产美女主播视频一区| 国产男女无遮挡猛进猛出| 91一区一区三区| 欧美日韩国产精品一区二区三区| 色久优优欧美色久优优| 高清一区二区三区四区| 日韩一区二区三区在线播放| 黄色成人免费网| 国产精品久久久久久久久婷婷| 天天做天天爱天天综合网| av观看免费在线| av中文字幕亚洲| 久久久无码一区二区三区| 欧美精品tushy高清| 亚洲资源视频| 一区二区视频网站| 国产91一区| 欧美色精品天天在线观看视频| 国产厕所精品在线观看| 亚洲AV无码精品色毛片浪潮| 日韩精品色哟哟| 亚洲成人三级在线| a级黄色片免费| 国产精品毛片一区二区三区四区| 色伦专区97中文字幕| 亚洲承认视频| 久久综合色一本| 亚洲麻豆一区| 亚洲精品乱码久久| 亚洲成精国产精品女| 丰满少妇高潮在线观看| 美女视频黄免费的亚洲男人天堂| 四虎国产精品免费久久| 国产剧情久久久久久| 波多野结衣视频免费观看| 欧美夫妻性生活| 黄色成人在线| 91精品国产自产在线| 久久精品高清| 国产无遮挡猛进猛出免费软件 | 国产一区二区三区四区hd| 欧美日本二区| 欧美日韩一区二区区别是什么| 亚洲大奶少妇| 国产视频999| 99精品视频在线观看播放| jizz欧美性11| 亚洲欧洲日韩一区二区三区| 国产又粗又长又黄| 久久躁狠狠躁夜夜爽| 国产精品欧美一区二区三区不卡 | 精品人妻无码一区二区三区换脸| 日韩欧美在线字幕| yw193.com尤物在线| 国产在线999| 欧美国产另类| 在线免费观看污视频| 色综合久久中文字幕| www免费网站在线观看| 成人做爰www免费看视频网站| 欧美在线亚洲综合一区| 中文字幕人妻一区| 色综合色狠狠综合色| 91在线视频| 91影院未满十八岁禁止入内| 日韩亚洲精品在线| 香蕉视频久久久| 91精品免费在线| 91在线超碰| 亚洲在线视频一区二区| 国产91丝袜在线播放| 老熟妇仑乱一区二区av| 中文字幕亚洲综合| 国产精品天天看天天狠| 国产精品69页| 亚洲免费观看高清完整版在线观看熊 | 九九精品视频在线| 色爱综合av| 极品粉嫩美女露脸啪啪| 亚洲成av人片在www色猫咪| 国产黄色免费在线观看| 91九色蝌蚪成人| 日本欧美一区二区三区| 成人免费看片98| 最近中文字幕日韩精品| 国产精品男女| 午夜一区二区视频| 欧美视频第一页| av网站在线免费看推荐| 欧美日韩国产免费一区二区三区 | 国产123在线| 精品第一国产综合精品aⅴ|