• Android上层WatchDog学习笔记


    学习总结

    Watchdog是一个运行在system_server进程的名为”watchdog”的线程::

    • Watchdog运作过程,当阻塞时间超过1分钟则触发一次watchdog,会杀死system_server,触发上层重启;
    • mHandlerCheckers记录所有的HandlerChecker对象的列表,包括foreground, main, ui, i/o, display线程的handler;
    • mHandlerChecker.mMonitors记录所有Watchdog目前正在监控Monitor,所有的这些monitors都运行在foreground线程。
    • 有两种方式加入Watchdog监控
      • addThread():用于监测Handler线程,默认超时时长为60s.这种超时往往是所对应的handler线程消息处理得慢;
      • addMonitor(): 用于监控实现了Watchdog.Monitor接口的服务.这种超时可能是”android.fg”线程消息处理得慢,也可能是monitor迟迟拿不到锁;

    以下情况,即使触发了Watchdog,也不会杀掉system_server进程:

    • monkey: 设置IActivityController,拦截systemNotResponding事件, 比如monkey.
    • hang: 执行am hang命令,不重启;
    • debugger: 连接debugger的情况, 不重启;

     

    1. 监控Handler线程

    Watchdog监控的线程有:默认地DEFAULT_TIMEOUT=60s,调试时才为10s方便找出潜在的ANR问题。

    线程名对应handler说明Timeout
    main new Handler(Looper.getMainLooper()) 当前主线程 1min
    android.fg FgThread.getHandler 前台线程 1min
    android.ui UiThread.getHandler UI线程 1min
    android.io IoThread.getHandler I/O线程 1min
    android.display DisplayThread.getHandler display线程 1min
    ActivityManager AMS.MainHandler AMS线程 1min
    PowerManagerService PMS.PowerManagerHandler PMS线程 1min
    PackageManager PKMS.PackageHandler PKMS线程 10min

    目前watchdog会监控system_server进程中的以上8个线程:

    • 前7个线程的Looper消息处理时间不得超过1分钟;
    • PackageManager线程的处理时间不得超过10分钟;

     

    2. 监控同步锁

    能够被Watchdog监控的系统服务都实现了Watchdog.Monitor接口,并实现其中的monitor()方法。运行在android.fg线程, 系统中实现该接口类主要有:

    • ActivityManagerService
    • WindowManagerService
    • InputManagerService
    • PowerManagerService
    • NetworkManagementService
    • MountService
    • NativeDaemonConnector
    • BinderThreadMonitor
    • MediaProjectionManagerService
    • MediaRouterService
    • MediaSessionService
    • BinderThreadMonitor

     

    3. 输出信息

    watchdog在check过程中出现阻塞1分钟的情况,则会输出:

    1. AMS.dumpStackTraces:输出system_server和3个native进程的traces
      • 该方法会输出两次,第一次在超时30s的地方;第二次在超时1min;
    2. WD.dumpKernelStackTraces,输出system_server进程中所有线程的kernel stack;
      • 节点/proc/%d/task获取进程内所有的线程列表
      • 节点/proc/%d/stack获取kernel的栈
    3. doSysRq, 触发kernel来dump所有阻塞线程,输出所有CPU的backtrace到kernel log;
      • 节点/proc/sysrq-trigger
    4. dropBox,输出文件到/data/system/dropbox,内容是trace + blocked信息
    5. 杀掉system_server,进而触发zygote进程自杀,从而重启上层framework。

    参考:

    1.WatchDog工作原理:http://gityuan.com/2016/06/21/watchdog/

  • 相关阅读:
    Jenkins和pipeline
    Docker摘要
    javascript文件加载模式与加载方法
    Pre-shared key
    持续集成CI相关的几个概念
    Fetch诞生记
    Content Security Policy介绍
    vivalidi 一款由Web技术诞生的Web浏览器
    Javascript async异步操作库简介
    Polymer初探
  • 原文地址:https://www.cnblogs.com/hellokitty2/p/12264229.html
Copyright © 2020-2023  润新知