gpt4 book ai didi

android Watchdog 实现剖析

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章android Watchdog 实现剖析由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

系统启动过程图:   framework层所有的service都是运行在systemserver进程中;systemserver进程是由zygote进程创建。 systemserver进程启动分两个过程init1创建service和进程状态对象;init2创建framework层的service,将其加入到servicemanager中,最后启动launcher; android提供了watchdog类,用来监测service是否处于正常工作中,是在systemserver中启动的。 下面看一下systemserver中watchdog这个过程。 systemserver.java

复制代码 代码如下

public void run() { //初始化watchdog 传入各个service作为参数 watchdog.getinstance().init(context, battery, power, alarm, activitymanagerservice.self()); //启动watchdog watchdog.getinstance().start(); } 。

watchdog类实现 类继承结构:   看到watchdog是一个thread,运行在systemserver进程中,单例模式; heartbeathandler处理接受监控的对象(service),运行在主线程中; monitor提供监控接口,接受监控对象实现此接口; xxxservice具体实现的检测对象。 执行流程:   对外接口 初始化:

复制代码 代码如下

public void init(context context, batteryservice battery, powermanagerservice power, alarmmanagerservice alarm, activitymanagerservice activity) { //存储service对象,运行在同一个进程中 mresolver = context.getcontentresolver(); mbattery = battery; mpower = power; malarm = alarm; mactivity = activity; //注册广播 context.registerreceiver(new rebootreceiver(), new intentfilter(reboot_action)); mrebootintent = pendingintent.getbroadcast(context, , new intent(reboot_action), 0); …… //开机时间 mboottime = system.currenttimemillis(); } 。

注册监控对象:

复制代码 代码如下

public void addmonitor(monitor monitor) { synchronized (this) { //将监控对象加入到列表中 mmonitors.add(monitor); } } 。

搜索一下此函数的调用,表示被监控;看到在如下service中实现watchdog的monitor接口: activitymanagerservice inputmanagerservice networkmanagementservice powermanagerservice windowmanagerservice 都有调用:watchdog.getinstance().addmonitor(this); watchdog线程执行函数:

复制代码 代码如下

public void run() { boolean waitedhalf = false; while (true) { //监测完成标志 mcompleted = false; //发送监测消息 mhandler.sendemptymessage(monitor); synchronized (this) { long timeout = time_to_wait; long start = systemclock.uptimemillis(); while (timeout > 0 && !mforcekillsystem) { //休眠等待检查结果 wait(timeout); // notifyall() is called when mforcekillsystem is set timeout = time_to_wait - (systemclock.uptimemillis() - start); } if (mcompleted && !mforcekillsystem) { //检查结果ok waitedhalf = false; continue; } //在进行检查一次 if (!waitedhalf) { activitymanagerservice.dumpstacktraces(true, pids, null, null, native_stacks_of_interest); waitedhalf = true; continue; } } //表明监控对象有问题 // if we got here, that means that the system is most likely hung. // first collect stack traces from all threads of the system process. // then kill this process so that the system will restart. //保存stack信息 …… // only kill the process if the debugger is not attached. if(!debug.isdebuggerconnected()) { if(systemproperties.getint("sys.watchdog.disabled", 0) == 0) { //kill当前进程systemserver process.killprocess(process.mypid()); system.exit(10); } } waitedhalf = false; } } 。

在此run函数中循环发送消息,判断标志是否正常,决定检测对象是否正常工作。 若监测对象不正常工作,则收集重要的stack信息保存下来,然后重启systemserver。 监测消息的处理: 是在heartbeathandler中进行,看看消息处理函数.

复制代码 代码如下

public void handlemessage(message msg) { switch (msg.what) { case monitor: { // see if we should force a reboot. //监测对象是否正常工作中…… final int size = mmonitors.size(); for (int i = 0 ; i < size ; i++) { //调用监测对象的monitor接口 mcurrentmonitor = mmonitors.get(i); mcurrentmonitor.monitor(); } //走到这里表明监测对象正常 synchronized (watchdog.this) { mcompleted = true; mcurrentmonitor = null; } } break; } } 。

判断监测对象是否正常工作,通过调用监测对象实现的接口monitor,看看这个接口该如何执行的。 powermanagerservice中: public void monitor() { //判断service是否发生死锁,如果发生死锁,程序将在此一直等待//主要是线程间同步问题 造成死锁 synchronized (mlocks) { } } 以上便是watchdog监测service是否正常工作的流程;我们也可以使用watchdog来监测别的资源如内存等使用情况。 这个watchdog给我们提供了一种思路,一种框架,对程序正常运行或者资源的正常使用情况等的一种监测机制.

最后此篇关于android Watchdog 实现剖析的文章就讲到这里了,如果你想了解更多关于android Watchdog 实现剖析的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com