Android 中WatchDog机制
概述:
Android系统里的看门狗机制,顾名思义就是“看门狗”,实际上就是Android平台用来监视核心系统服务,比如活动管理器是否发生僵死,以及任务执行是否超时的措施,一旦发生这些状况,就会触发设备重新启动操作。
工作方式是这样的:WatchDog是一个持续运行的程序,它一直不断地进行循环操作,在每次循环中都会检查每一个HandlerChecker里面包含的所有mMonitors,只有当所有这些mMonitors都在规定时间内(即60秒)顺利完成运行并返回,这个程序才会认为任务成功完成,否则就会认定操作超时,接着会输出一些程序运行时的内存信息,将相关日志信息记录到“/data/anr/”目录下,同时也会将数据传输到dropboxkaiyun.ccm,最终导致整个系统进行重启。监控功能就是针对相应系统服务的接口,用于判断是否发生死锁开元棋官方正版下载,或者发现异常情况,这个功能需要在各个系统服务中具体实现。
启动:
watch承担着系统关键监控职责,在system_server初次启动服务时,即“startBootstrapServices”函数内,由于wachdog记录日志须借助context,故AMS初始化后kaiyun全站登录网页入口,会经由init函数将context提供给wachdog这个单例对象
在基础框架服务中的系统服务类文件位于此路径
私有方法启动引导服务,接受一个非空的计时追踪与日志记录参数
...
最终创建了名为watchdog的看门狗实例对象
watchdog.start();
t.traceEnd();
...
服务管理器启动了活动任务管理服务,并将其赋值给变量atm
ActivityTaskManagerService的Lifecycle类,获取服务实例
mActivityManagerService = ActivityManagerService.Lifecycle启动服务,
mSystemServiceManager, atm);
mActivityManagerService将系统服务管理器对象赋值给系统服务管理器属性,确保其正确关联
活动管理器服务将安装器对象传入安装器接口,并完成设置操作。
mWindowManagerGlobalLock是atm获取的全局锁,
...
t开始追踪"初始化看门狗",
初始化看门狗,传入系统上下文和管理活动服务对象,完成初始化过程
t.traceEnd();
...
构造函数:
基础架构服务核心组件的Java包路径为框架目录下的服务器监控组件文件名
private Watchdog() {
super("watchdog");
为每个需要检测的常用线程初始化处理器检查器,请注意
我们此刻并未核查后台线程,因为该线程可能会
能够容纳持续较长时间的运作过程,但无法确保其时效性
// of operations there.
共享的前景线程是主要的检查者, 它是我们进行相关操作的场所
还将安排监督审查,同时处理其他事务。
mMonitorChecker这个对象被创建了,它是一个HandlerChecker实例,其构造函数接收了FgThread类获取的Handler对象作为参数
主线程, 默认超时时间
处理器检查器列表中加入了监控检查器
添加主线程的校验,我们仅执行快速检测,因为
可以是界面在线程上执行的程序
mHandlerCheckers加入一个HandlerChecker实例,该实例包含一个Handler对象,这个Handler对象由Looper.getMainLooper()方法获取的主线程Looper创建,
主线程, 默认超时时间)
增加检查以确认是否在公共界面线程上运行。
此处增加了新的处理器检测对象,该对象针对主线程的消息处理器进行监控,具体实现方式是通过创建一个处理器检查器实例,并将其添加到管理器集合中,该检查器负责对用户界面线程的处理器进行跟踪,确保其正常运行,同时能够及时发现并处理异常情况,整个过程中,主线程的处理器是核心关注点,通过这种方式,可以增强系统的稳定性和可靠性,避免因处理器问题导致的程序崩溃或响应迟缓现象,最终目的是提升用户体验,确保应用程序的流畅运行
主线程, 默认超时时间)
// And also check IO thread.
mHandlerCheckers增加一个HandlerChecker对象,这个对象关联着IoThread的处理器,通过IoThread获取处理器,然后赋值给HandlerChecker构造函数的第一个参数
输入输出线程,默认超时时间)
// And the display thread.
新建一个处理器检测器,并将其添加到检测器列表中,该处理器来自显示线程,其句柄为DisplayThread的句柄对象,
显示线程,默认超时时间
// And the animation thread.
mHandlerCheckers加入一个HandlerChecker实例,该实例以AnimationThread获取的Handler作为参数,
动画执行序列,默认超时时间
此外,还有负责表面动画的那个线程
此处理器检查器被添加到处理器检查器集合中,该处理器来自表面动画线程,其句柄为SurfaceAnimationThread提供的句柄,并且这个句柄被用于初始化新的处理器检查器实例,整个动作发生在主线程上下文中,目的是监控和处理相关事件,确保界面流畅运行,同时也能及时发现并解决潜在问题,维护系统的稳定性和性能,整个过程是自动化的,无需人工干预,由系统内部机制自动完成,确保了高效性和可靠性
动画表层线程,默认超时时间)
设置监视器以管理 Binder 线程的运行状态,确保其正常工作,并随时准备响应相关请求。
新增一个 BinderThread 监控器实例
mOpenFdMonitor = 创建一个 OpenFdMonitor 对象
把当前进程的标识追加到mInterestingJavaPids集合中。
请参阅关于默认超时的注释。
assert DB ||
默认超时值大于 ZygoteConnectionConstants.WRAPPED_PID_TIMEOUT_MILLIS 这个值
}
此处涉及systemserver.java文件,该文件运用单例模式来创建watchdog对象,此对象会持续监督若干核心线程,特别要指出的是Fgthread被特别分离出来,它主要用于配合addMonitor来管理HandlerChecker,具体内容将在后续部分进行说明。
同样存在一个关键的监控机制,就是Binder,这种机制的实例数量最多只能达到十六个,不能继续增加,这也可以看作是monitor检测应用的一个场景。另外,AMS系统也会在monitor环节尝试获取同步锁,如果未能成功获取,就会认定发生了死锁状况,后面会对此进行详细说明。
frameworks\base\services\core\java\com\android\server\Watchdog.java
pr