美文网首页andnroidAndroid
【Android】ANR是如何产生的?

【Android】ANR是如何产生的?

作者: littlefogcat | 来源:发表于2021-12-24 17:49 被阅读0次

    众所周知,Android的输入事件是通过InputReader监听系统dev/input下的文件来获取输入事件,并由InputDispatcher来进行分发的。

    而ANR事件就是在InputDispatcher中产生的。

    一、InputDispatcher

    1. InputDispatcherThread

    InputDispatcher内部维护了一个线程InputDispatcherThread,输入事件在这个线程中进行处理。这个线程在InputManager中进行创建和启动。

    它只做了一件事,就是无限调用dispatchOnce()进行事件分发。

    2. dispatchOnce 和 dispatchOnceInnerLocked

    dispatchOnce()会调用dispatchOnceInnerLocked()进行事件分发,而如果判断出当前事件是触摸事件,则会又调用dispatchMotionLocked()来分发触摸事件。在处理结束之后,会阻塞直到下一次事件的到来。

    3. dispatchMotionLocked 和 findTouchedWindowTargetsLocked

    dispatchMotionLocked()会调用findTouchedWindowTargetsLocked()查找触摸事件对应窗口目标并进行分发。如果当前窗口尚有未处理完的事件,则会调用handleTargetsNotReadyLocked处理。

    4. handleTargetsNotReadyLocked

    handleTargetsNotReadyLocked会判断目标事件等待时间,如果其大于5秒,则会调用onANRLocked进入ANR流程。

    以上便是ANR的产生过程。

    二、总结

    ANR的产生有两个必要条件:

    1. 至少需要两个事件;
    2. 在第二个事件到来的时候,第一个事件尚未处理完毕,并且处理时间超过5秒。

    三、参考资料:

    /frameworks/native/services/inputflinger/InputDispatcher.cpp
    Android输入事件分发与拦截

    相关文章

      网友评论

        本文标题:【Android】ANR是如何产生的?

        本文链接:https://www.haomeiwen.com/subject/bhilqrtx.html