Android 4.4 Watchdog机制

Android 软watchdog机制主要功能集中在两个层面:

1),监听系统的reboot广播;

2),监听相关service是否死锁。

首先,从代码看,watchdog是由SystemServer.java启动:

这几行代码首先是初始化了watchdog,

添加UIThread,FgThread,IoThread,还有当前new Watchdog时候的主线程,其实就是System_server主线程。

添加至mHandlerCheckers这个MonitorList中,接下来看init接口:

这个接口里边将需要watchdog监听的几个service赋值过来,同时注册接收reboot的广播。

随后SystemServer通过Watchdog.getInstance().start();调用其run方法,开始循环侦听功能。

run()方法中有一个无限循环,每次循环中主要做三件事:

1. 调用scheduleCheckLocked()方法给所有受监控的线程发送消息。scheduleCheckLocked()方法的代码如下

publicvoidscheduleCheckLocked() {

if(mMonitors.size() == 0 &&mHandler.getLooper().isIdling()) {

mCompleted= true;

return;

}

if(!mCompleted) {

return;

}

mCompleted= false;

mCurrentMonitor= null;

mStartTime= SystemClock.uptimeMillis();

mHandler.postAtFrontOfQueue(this);//给监视的线程发送消息

}

HandlerChecker对象即要监控服务,也要监控某个线程。所以上面的代码先判断mMonitors的size是否为0。如果为0,说明这个HandlerChecker没有监控服务,这时如果被监控线程的消息队列处于空闲状态(调用isIdling()检查),则说明线程运行良好,把mCompleted设为true后就可以返回了。否则先把mCompleted设为false,然后记录消息开始发送的时间到变量mStartTime中,最后调用postAtFrontOfQueue()方法给被监控的线程发送一个消息。此时在Handler.java的

public void dispatchMessage(Message msg) {

if (msg.callback != null) {

handleCallback(msg);

} else {

if (mCallback != null) {

if(mCallback.handleMessage(msg)) {

return;

}

}

handleMessage(msg);

}

}

private static void handleCallback(Message message) {

message.callback.run();

}

这个消息的处理方法是HandlerChecker类的方法run(),代码如下:

public void run() {

finalint size = mMonitors.size();

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

synchronized(Watchdog.this) {

mCurrentMonitor= mMonitors.get(i);

}

mCurrentMonitor.monitor();

}

synchronized(Watchdog.this) {

mCompleted= true;

mCurrentMonitor= null;

}

}

如果消息处理方法run()能够被执行,说明受监控的线程本身没有问题。但是还需要检查被监控服务的状态。检查是通过调用服务中实现的monitor()方法来完成的。通常monitor()方法的实现是获取服务中的锁,如果不能得到,线程就会被挂起,这样mCompleted的值就不能被置成true了。

mCompleted的值为true,表明HandlerChecker对象监控的线程或服务正常。否则就可能有问题。是否真有问题还要通过等待的时间是否超过规定时间来判断。

moninor()方法的实现通常如下:

public void monitor() {

synchronized(mLock) {

}

}

2. 给受监控的线程发送完消息后,调用wait()方法让WatchDog线程睡眠一段时间。

3. 逐个检查是否有线程或服务出问题了,一旦发现问题,马上杀死进程。

前面调用了方法evaluateCheckerCompletionLocked()来检查线程或服务是否有问题。evaluateCheckerCompletionLocked()方法的代码如下:

privateintevaluateCheckerCompletionLocked() {

intstate = COMPLETED;

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

HandlerCheckerhc =mHandlerCheckers.get(i);

state= Math.max(state,hc.getCompletionStateLocked());

}

returnstate;

}

getCompletionStateLocked()函数根据等待时间来确认返回HandlerChecker对象的状态,代码如下:

public int getCompletionStateLocked() {

if(mCompleted) {

returnCOMPLETED;

}else {

longlatency = SystemClock.uptimeMillis() -mStartTime;

if(latency < mWaitMax/2) {

returnWAITING;

}else if (latency < mWaitMax) {

returnWAITED_HALF;

}

}

returnOVERDUE;

}

本文只对流程做了相对简单的分析,抛开监听reboot广播不说,在我看来,监听线程就是定时分别尝试获取一次添加到watchdog monitorcheckerList中的service的monitor()接口(尝试获取一次service内部的锁),如果成功获取并释放,则说明service未出现死锁的状况,则一段时间后继续该操作;如若不然,即获取service内相关的锁失败,则说明有service可能处于死锁状态,从而Watchdog线程杀死SystemServer进程。SystemServer监控重要service,重要service
hang则SystemServer死,SystemServer死则Zygote监控到,Zygote也死并且杀死整个Java世界,Zygote死则init监控到,init重新启动Zygote,之后SystemServer、service又进入重生过程。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-01 16:56:29

Android 4.4 Watchdog机制的相关文章

android中的多线程机制

Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.       Message Queue 消息队列,用来存放通过Handler发布的消息,按照先进先出执行. 3.       Handler Handler是Messa

Android触摸屏事件派发机制详解与源码分析二(ViewGroup篇)

1 背景 还记得前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>中关于透过源码继续进阶实例验证模块中存在的点击Button却触发了LinearLayout的事件疑惑吗?当时说了,在那一篇咱们只讨论View的触摸事件派发机制,这个疑惑留在了这一篇解释,也就是ViewGroup的事件派发机制. PS:阅读本篇前建议先查看前一篇<Android触摸屏事件派发机制详解与源码分析一(View篇)>,这一篇承接上一篇. 关于View与ViewGroup的区别在前一篇的A

Android Touch事件传递机制解析

开篇语:最近程序在做一个小效果,要用到touch,结果整得云里面雾里的,干脆就好好把android touch机制好好看了一下,呵呵.. android系统中的每个ViewGroup的子类都具有下面三个和TouchEvent处理密切相关的方法: 1)public boolean dispatchTouchEvent(MotionEvent ev)          这个方法用来分发TouchEvent 2)public boolean onInterceptTouchEvent(MotionEv

Android touch 事件传递机制

前言: (1)在自定义view的时候经常会遇到事件拦截处理,比如在侧滑菜单的时候,我们希望在侧滑菜单里面有listview控件,但是我们希望既能左右滑动又能上下滑动,这个时候就需要对触摸的touch事件进行拦截.这个时候我们就需要明白android touch 事件传递机制, (2)以前很多时候比较模糊,也许是网上看到也有很多事件传递的相关文章,但我看着头晕,解释不彻底,有的说得一半,总算不满足不满意,于是据我自己的理解来彻底的来整理下具体的是怎么个传递方式,分享给大家,希望大家看到有什么不对的

Android View 事件分发机制 源码解析 (上)

一直想写事件分发机制的文章,不管咋样,也得自己研究下事件分发的源码,写出心得~ 首先我们先写个简单的例子来测试View的事件转发的流程~ 1.案例 为了更好的研究View的事件转发,我们自定以一个MyButton继承Button,然后把跟事件传播有关的方法进行复写,然后添加上日志~ MyButton [java] view plain copy package com.example.zhy_event03; import android.content.Context; import andr

【转】Android Touch事件传递机制解析

原文地址:http://www.cnblogs.com/runssnail/p/4250549.html 说明:本文在原文地址上有所改动 一.小故事 在讲正题之前我们讲一段有关任务传递的小故事,抛砖迎玉下: 话说一家软件公司,来一个任务,分派给了开发经理去完成 开发经理拿到,看了一下,感觉好简单,于是 开发经理:分派给了开发组长 开发组长:分派给了自己组员(程序员) 程序员:分派给了自己带的实习生. 实习生:好苦逼,无法分派,怎么办啊?只能自己干了 但是实习生能不能做好,有两种情况了. 情况一:

Android消息推送机制

1.推送方式基础知识: 当我们开发需要和服务器交互的应用程序时,基本上都需要获取服务器端的数据,比如<地震应急通>就需要及时获取服务器上最新的地震信息.要获取服务器 上不定时更新的信息一般来说有两种方法,第一种是客户端使用Pull(拉)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现.第二种就是 服务器使用Push(推送)的方式,当服务器端有新信息了,则把最新的信息Push到客户端上.? 虽然Pull和Push两种方式都能实现获取服务器端更新信息的功能,但是明显来说Push is

android触碰消息传递机制

前阵子要的工作是给桌面(Launcher启动器,其实也是一个activity)添加一个触摸特效(一个View),而这个特效是每次触碰都会有,不管你在桌面上做什么操作都会显示特效!之前一直摸索着不知道如何入手,后来慢慢的实验之后才知道有个android触碰消息传递机制.自己摸索的确很慢,要是早点知道这个机制那将会事半功倍. 用户的每次触碰(onClick,onLongClick,onScroll,etc.)都是由一个ACTION_DOWN+n个ACTION_MOVE+1个ACTION_UP组成的,

Android Framework 分析---消息机制Native层

在Android的消息机制中,不仅提供了供Application 开发使用的java的消息循环.其实java的机制最终还是靠native来实现的.在native不仅提供一套消息传递和处理的机制,还提供了自定义文件描述符的I/O时间的监听机制.下面我们从具体代码中分析一下. Native层的关键类: Looper.cpp.该类中提供了pollOnce 和wake的休眠和唤醒机制.同时在构造函数中也创建 管道 并加入epoll的机制中,来监听其状态变化. Looper::Looper(bool al