ANR触发原理(what triggers ANR?)

Ref:

http://developer.android.com/training/articles/perf-anr.html

http://stackoverflow.com/questions/3467205/android-key-dispatching-timed-out

http://blog.csdn.net/wuhengde/article/details/8007448

谷歌develop官网上对ANR触发机制是这样描述的:

此处从源码角度分析下AMS和WMS是如何monitor ANR的。

Android版本:Android 5.0

分析对象:keyDispatchingTimedOut的monitor机制

 

1. keyDispatchingTimedOut(此处‘key‘不准确,其实是InputEvent(包含KeyEvent和TouchEvent)派发超时,当前触屏手机上,以TouchEvent/MotionEvent为主),先看下这块的类图:

可以看到真正干活的是在Native侧,由native侧monitor事件是否超时,并触发调用Java侧notifyANR逻辑。

anr monitor的大概时序如下:

ANR monitor核心工作由InputDispatcher.cpp完成,在每次派发事件时,需要进行如下判断:

1. 判断是否有focused组件及focusedApplication

2. 判断前面的事件是否及时完成

对于1,一般是在启动时可能触发,比如启动时间过长,在这过程中触发keyevent或trackball motionevent, 则进行如下逻辑判断:

这种情况下,对应的ANR log如下:

Reason: Input dispatching timed out (Waiting because no window has focus but there is a focused application that may eventually add a window when it finishes starting up.)

对于2,KeyEvent和MotionEvent对“及时性”的策略不同,KeyEvent需要判断上一个事件是否做完(由于涉及focus的问题,KeyEvent必须等wms处理前一个事件,才把新的事件派发过去):

checkWindowReadyForMoreInputLocked

而touchevent(touch screen,e.g.),则需判断事件等待队列里的head的事件时间是否已经过去0.5秒了,相对来说,touchevent的要求更

低些,允许的执行时延更大,此时,说明UI线程卡住了,一堆touch event在等待执行,需要停止event delivery,

因此无论是keyevent(实体键输入)还是touchevent(点击view)都是因为UI线程没及时处理完前面的事件导致.

设置anr的start和timeout值,在timeout时刻唤醒事件,再依据上述条件判断是否可以event delivery,

若满足事件派发条件, 则可以走正常派发流程,否则(如UI线程卡住、UI线程抢不到CPU等), 则触发onANRLocked,后续流程如时序图所示。

时间: 2024-10-11 05:15:39

ANR触发原理(what triggers ANR?)的相关文章

理解ANR的前世今生,解决ANR就是这么简单!

1. 什么是ANR? ANR(Application Not Responding)即应用程序无响应. 2. ANR产生的原因是什么? ANR产生的根本原因是APP阻塞了UI线程.在android系统中每个App只有一个UI线程,是在App创建时默认生成的,UI线程默认初始化了一个消息循环来处理UI消息,ANR往往就是处理UI消息超时了.那么UI消息来源有哪些呢?主要有两种来源: 2.1 来自于AMS的回调消息 在Android系统中,应用程序是有Android的四大组件组成,AMS负责对应用程

进程调度函数scheduler_tick()的触发原理:周期PERIODIC定时器

参考文章: https://www.jb51.net/article/133579.htm https://blog.csdn.net/flaoter/article/details/77509553 https://www.cnblogs.com/arnoldlu/p/7078204.html 中时间子系统相关系列blog,讲的比较详细. 主要文件所在目录: kernel/msm-4.9/kernel/time/tick-common.c.tick-dchrf.c.timer.c.hrtime

Android ANR分析(三)

http://www.jianshu.com/p/8964812972be http://stackoverflow.com/questions/704311/android-how-do-i-investigate-an-anr Keeping Your App Responsive PreviousNext In this document What Triggers ANR? How to Avoid ANRs Reinforcing Responsiveness You should a

Android ANR、Force Closed(转)

ANRs (“Application Not Responding”),意思是”应用没有响应“. 在如下情况下,Android会报出ANR错误: – 主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件 – BroadcastReceiver 没有在10秒内完成返回 通常情况下,下面这些做法会导致ANR 1.在主线程内进行网络操作 2.在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询) 应用应该在5秒或者10秒内响应,否则用户会觉得“这个应用很垃圾”“烂”“慢

[转发]Android 系统稳定性 - ANR(一)

文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任.很久之前写的了,留着有点浪费,共享之.编写者:李文栋  http://rayleeya.iteye.com/blog/1955652 如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡.缴税和ANR.这么说是夸张了,但是由于Android本身的设计,以及应用程序和系统在开发过程中的缺陷,经常会在测试过程中遇到各种各样的ANR问题.在功能性的测试中还少一些,主要是在压力测试中(例如Monkey测试)会遇到非常

Android System ANR caused SWT restart issue

一.问题现象 1.用户直观看到的现象是System先ANR. 2.ANR之后系统重启. 测试方法: 在录音的界面不停的滑动音量进度条,同时座机给测试机打电话,电话没有接通,只见界面冻结,弹出ANR,接着系统重启. Platform:MT6732 Android版本:4.4.4KK BuildType:user 系统软件版本:SWA3A+UMA0 系统RAM:1GB 问题概率:≈2% 参考机行为: 1.低概率问题,暂无参考机行为. 二.解决方案 通过初步分析.深入分析(具体分析过程.关键代码和lo

Android ANR优化 1

1, 你碰到ANR了吗 在App使用过程中, 你可能遇到过这样的情况: ANR 恭喜你, 这就是传说中的ANR. 1.1 何为ANR ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框. 1.2 为什么会产生ANR 在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框

Android App优化之ANR详解

引言 背景:Android App优化, 要怎么做? Android App优化之性能分析工具 Android App优化之提升你的App启动速度之理论基础 Android App优化之提升你的App启动速度之实例挑战 Android App优化之Layout怎么摆 Android App优化之ANR详解 Android App优化之消除卡顿 Android App优化之内存优化 Android App优化之持久电量 Android App优化之如何高效网络请求 App优化系列已近中期, 前面分

Android ANR的产生与分析

ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框.也许有些开发者在使用某些手机开发中不在弹出应用无响应弹出框,特别是国产手机Android4.0以上的系统中,即使在开发者选项中设置了"显示所有应用无响应-为后台应用显示无响应ANR对话框",主要是因为在某些国产手机系统中就将该选项屏蔽了,应用超过了一定时间无响应也不会弹出ANR对话框了. 一般情况下应用无响应的时候回产生一个日志文件,位于/data/anr/文件夹下面,