Android看门狗(WatchDog)

一:概念

    Android WatchDog(看门狗)是Android系统中用于监控系统关键服务的运行状态的机制,其核心目标是检测系统服务是否因死锁、阻塞或异常导致长时间无响应,并在必要时触发系统恢复(如重启)。

二:核心功能


2.1 服务状态监控

定期检查关键系统服务(如ActivityManager、WindowManager等)是否正常响应,防止服务阻塞导致系统卡死。

2.2 超时处理

若某个服务未在规定时间内更新“心跳”(monitor),WatchDog判定为超时,触发后续处理流程。

2.3 日志收集与调试

超时发生时,自动收集系统堆栈信息(包括所有线程的调用栈),帮助定位问题根源。

2.4 系统恢复

在严重超时情况下,可能强制重启系统进程(system_server)或整个设备,避免用户长时间面对无响应界面。

三:实现逻辑

3.1 启动

WatchDog像系统服务一样,是由SystemServer启动的,具体启动逻辑如下

frameworks/base/services/java/com/android/server/SystemServer.java
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
        ...
        //Watchdog对象的创建及线程的启动
        t.traceBegin("StartWatchdog");
        final Watchdog watchdog = Watchdog.getInstance();
        watchdog.start();
        mDumper.addDumpable(watchdog);
        t.traceEnd();
        ...
        //Watchdog初始化
        t.traceBegin("InitWatchdog");
        watchdog.init(mSystemContext, mActivityManagerService);
        t.traceEnd();
        ...
    }

3.2 初始化

  • WatchDog运行在"watchdog"线程中
  • "watchdog.monitor"后台线程,负责处理通过Handler发送的任务
  • HandlerChecker一个与ServiceThread的Looper关联的Handler。这个Handler会将消息和任务发送到ServiceThread中执行,用于监控线程的响应性,确保线程正常运行
  • 把"monitor thread"、"foreground thread"、"main thread"、"ui thread"、"i/o thread"、"display thread"、"animation thread"、"surface animation thread"等系统关键线程加入监控中
  • 初始化Binder线程的监视器
frameworks/base/services/core/java/com/android/server/Watchdog.java
    private Watchdog() {
        //新建一个名为"watchdog"的线程
        mThread = new Thread(this::run, "watchdog");

        ...
        //启动一个名为"watchdog.monitor"的后台线程,负责处理通过Ha
### Android 看门狗超时解决方案 #### 了解看门狗机制 在嵌入式系统中,看门狗定时器 (Watchdog Timer) 是一种硬件设备,在指定时间内如果没有收到程序发出的心跳信号,则会触发系统的复位操作。对于Android设备而言,watchdog守护进程定期向看门狗设备写消息以防止CPU被重置[^1]。 #### 解决方案概述 当遇到看门狗超时时,通常意味着应用程序未能及时响应或存在死锁情况。为了处理这种情况: - **优化代码逻辑**:确保所有关键路径上的函数能够快速返回,并且不会陷入无限循环。 - **增加心跳频率**:适当提高`write()`调用到/dev/watchdog文件的频次,从而降低因短暂卡顿而导致误触的风险。 - **捕获异常并恢复服务**:通过设置合适的错误处理器来捕捉可能导致长时间阻塞的操作,一旦检测到此类状况立即采取措施恢复正常运行状态。 ```cpp // 示例:增强版signal_handler_init()实现方式 void enhanced_signal_handler_init(){ struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = handle_signals_and_feed_watchdog; // 自定义信号处理兼喂狗功能 sa.sa_flags = SA_SIGINFO; if(sigaction(SIGTERM, &sa, NULL)<0){ perror("sigaction"); exit(EXIT_FAILURE); } } ``` 上述C++片段展示了如何扩展原有初始化信号处理器的方法,使其不仅负责常规的任务终止通知,还承担起周期性的“喂狗”职责[^3]。 #### 日志记录的重要性 日志可以帮助定位问题根源所在。例如,在init进程中可以通过如下所示的方式配置日志输出至内核缓冲区,便于后续排查分析可能存在的性能瓶颈或者挂起位置[^2]: ```c++ #include <android-base/logging.h> ... int main(int argc, char* argv[]) { android::base::InitLogging(argv, &android::base::KernelLogger); ... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值