ArkUI Engine – 深入ANR机制
内容提要
本文介绍了鸿蒙操作系统中的WatchDog机制和ANR判定的代码细节,包括WatchDog的初始化和ANR的判定方法。通过学习这些源码,可以更好地了解ArkUIEngine并进行性能监控和优化。
延伸解读
WatchDog 初始化与 GC 信号处理
WatchDog 构造时启动 AnrThread,提供事件循环能力。在 OHOS 或 Android 平台,还会通过 PostTaskToTaskRunner 注册 GC 信号处理:将当前线程记录为信号处理线程,阻塞 GC 信号,绑定 SIGNAL_FOR_GC(60)到 OnSignalReceive,并启动 CheckGcSignal 循环。CheckGcSignal 使用 sigtimedwait 等待信号,收到后触发 AceEngine 的 TriggerGarbageCollection,然后重新投递检查
ANR 状态机与线程卡顿判定
ThreadWatcher 通过 Check 方法周期检查线程是否卡顿,状态分为 NORMAL、WARNING、FREEZE。IsThreadStuck 比较 loopTime_ 与 threadTag_ 的差值:loopTime_ 在每次 PostCheckTask 时自增,threadTag_ 在任务实际调度时自增。若差值持续增大且任务 ID 相同,则判定卡顿。首次卡顿进入 WARNING,再次卡顿升级为 FREEZE 并触发 DetonatedBomb。恢复后状态重置为 NORMAL。
炸弹机制:埋点、拆解与 ANR 弹窗
BuriedBomb 向 inputTaskIds_ 队列添加炸弹 ID,DefusingBomb 则投递任务移除队首炸弹。DetonatedBomb 检查队列非空且当前时间与队首炸弹 ID 差值超过 ANR_INPUT_FREEZE_TIME(5000ms)时,若 canShowDialog_ 为 true 则弹出 ANR 弹窗,并清空队列。若队列为空,即使消息延迟也不会判定为 ANR。弹窗后 canShowDialog_ 置 false,需累计 5 次 FREEZE 后才可再次弹出。
Q&A
WatchDog机制的主要功能是什么?
WatchDog机制用于监控系统流通度,防止ANR(无响应)情况的发生。
ANR状态是如何分类的?
ANR状态分为NORMAL、WARNING和FREEZE,分别对应正常、警告和冻结状态。
如何触发ANR弹窗?
通过DetonatedBomb函数触发ANR弹窗,判断条件是任务执行时间超过阈值。
WatchDog的初始化过程包括哪些步骤?
WatchDog的初始化包括创建AnrThread和注册GC信号。
ThreadWatcher类在ANR机制中起什么作用?
ThreadWatcher类是ANR机制的核心,负责检查线程是否卡顿。
用户如何进行ANR判定的埋炸弹和拆炸弹操作?
用户可以通过BuriedBomb方法进行埋炸弹,使用DefusingBomb方法进行拆炸弹操作。