新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
ANR是Application Not Responding的简称,主要是说应用程序出现无响应的情况。在这个情况出现的时候同时在手机界面会弹出响应的对话框,提示应用程序无响应
创新互联服务项目包括唐河网站建设、唐河网站制作、唐河网页制作以及唐河网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,唐河网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到唐河省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
ANR的几种类型:
当运行指定的APP,如果Android系统检测到符合下边的几种条件那就会弹出应用程序无响应的界面。
1)按键超时:Android默认的响应时间是5s,如果一个触屏事件超过5s,那么就会发生此现象。
2)广播超时:广播的默认响应时间是10s,如果一个广播在10s之内还美柚执行完,那么就会出现此现象。
3)服务超时:服务的默认响应事件是20s,如果请求的服务在20s内失败,那么就会发生此现象。
ANR事件与异常的区别
ANR事件是由于一些操作的原因或者是反应事件较慢会出现程序无响应的情况,而异常是程序由于代码或者是一些其他的原因出现程序停止运行的情况,这两种情况的性质是完全不一样的。
ANR: 很多初入Android开发的网友可能发现ANR的字样,到底Android ANR是什么呢? 其实ANR就是Application Not Responding的全称,当某个应用处于长期假死状态时Android系统会弹出一个窗口上面写道,XXX is not responding给出两个按钮一个为force close一个为wait。可能触发ANR的情况1. 长时间的I/O处理,比如读写大文件,网络访问时造成的阻塞。2. 执行耗时的运算,Android默认为超过5000ms即5秒开始弹出ANR窗口,某些应用可能首次执行时没有缓存十分耗时,可以通过Splash播放闪屏Logo等方式来延缓加载3. Service和appWidget中也要注意多线程的使用,除非它和Activity工作在不同的进程。避免ANR的方法1. 单独开工作者线程,通过独立的Thread或使用类似AsyncTask的方式来处理耗时的内容。2. 耗时的操作尽量分段处理,使用类似状态机的方法,类似Symbian的活动对象将一个复杂的事情,分段执行。3. UI线程中不要处理过多的内容,比如将一个5MB的文本,让TextView去setText,要知道这种UI操作,没有什么好方法去解决的,所以Android123提示,遇到UI中需要执行复杂的操作,可以参考上面2提到的分段处理方式。
ANR (“Application Not Responding”),意思是”应用没有响应“。
在如下情况下,Android会报出ANR错误:
1.主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件。
2.BroadcastReceiver 没有在10秒内完成返回。
通常情况下,下面这些做法会导致ANR:
1、在主线程内进行网络操作。
2、在主线程内进行一些缓慢的磁盘操作(例如执行没有优化过的SQL查询)。
应用应该在5秒或者10秒内响应,逻辑应该是:
1. new出一个新的线程,进行数据请求。
2. 获取数据后,调用handler.sendMessage方法。
3. 在handler的handle()方法中更新UI。
ANR: ANR全称是Application No Responding,翻译过来就是程序无响应, 他是Android独有的概念。定位和解决以及避免ANR是我们需要必备的技能。
1: ANR产生的原因:
Android的UI线程响应超时就会引起ANR, 主要体现在两种情况中:
2:典型的ANR场景:
1: 当一个ANR的问题产生, 我们无法确认是ANR watchdog或者是crash。每一种类型的问题的产生都有不同的影响范围和表现形态, 一般冻屏, 一段时间后程序退出, 这种情况的产生都是ANR。在我们的AP Log中,ANR的filter字段一般有这几种: ANR low_memory slow_operation. 我们根据这些关键字搜索到发生ANR的地方:
2: ANR log日志在系统的data/anr目录下, 我们将所有的anr log日志pull出来。
3: 打开这个文件
产生ANR的原因,是在主线程(即UI线程)做了太多耗时的操作,应该把非UI操作,例如网络数据获取,数据库操作等,放在异步线程中。
广播的 ANR 处理相对简单,主要是再次判断是否超时、记录日志,记录 ANR 次数等。然后就继续调用 processNextBroadcast 函数,处理下一条广播了。
ContentProvider 超时为 CONTENT_PROVIDER_PUBLISH_TIMEOUT = 10s
Activity 的 ANR 是相对最复杂的,也只有 Activity 中出现的 ANR 会弹出 ANR 提示框。
最终的表现形式是:弹出一个对话框,告诉用户当前某个程序无响应,输入一大堆与 ANR 相关的日志,便于开发者解决问题。
InputDispatching:
Activity 最主要的功能之一是交互,为了方便交互,Android 中的 InputDispatcher 会发出操作事件,最终在 InputManagerService 中发出事件,通过 InputChannel,向 Activity 分发事件。交互事件必须得到响应,如果不能及时处理,IMS 就会报出 ANR,交给 AMS 去弹出 ANR 提示框。
KeyDispatching:
如果输入是个 Key 事件,会从 IMS 进入 ActivityRecord.Token.keyDispatchingTimeOut,然后进入 AMS 处理,不同的是,在 ActivityRecord 中,会先截留一次 Key 的不响应,只有当 Key 连续第二次处理超时,才会弹出 ANR 提示框。
窗口焦点:
Activity 总是需要有一个当前窗口来响应事件的,但如果迟迟没有当前窗口(获得焦点),比如在 Activity 切换时,旧 Activity 已经 onPause,新的 Activity 一直没有 onResume,持续超过 5 秒,就会 ANR。
App 的生命周期太慢,或 CPU 资源不足,或 WMS 异常,都可能导致窗口焦点。
1. 判断是否有 focused 组件以及 focused Application:
这种一般是在应用启动时触发,比如启动时间过长在这过程中触发了 keyevent 或者 trackball moteionevent 就会出现。
对应于
2. 判断前面的事件是否及时完成:
对应于
出现这种问题意味着主线程正在执行其他的事件但是比较耗时导致输入事件无法及时处理。
InputDispatcher 超时是最常见的 ANR 类型,而且其类型也比较多。
当用户触摸屏幕或者按键操作,首次触发的是硬件驱动,驱动收到事件后,将该相应事件写入到输入设备节点, 这便产生了最原生态的内核事件。接着,输入系统取出原生态的事件,经过层层封装后成为 KeyEvent 或者 MotionEvent ;最后,交付给相应的目标窗口(Window)来消费该输入事件。可见,输入系统在整个过程起到承上启下的衔接作用。
Input 模块的主要组成:
每一个应用进程都会有一个 SignalCatcher 线程,专门处理 SIGQUIT,来到 art/runtime/signal_catcher.cc :
当应用发生 ANR 之后,系统会收集许多进程,来 dump 堆栈,从而生成 ANR Trace 文件。收集的第一个,也是一定会被收集到的进程,就是发生 ANR 的进程。接着系统开始向这些应用进程发送 SIGQUIT 信号,应用进程收到 SIGQUIT 后开始 dump 堆栈。
[1] developer ANRs
[2] Android ANR 分析详解
[3] 看完这篇 Android ANR 分析,就可以和面试官装逼了!
[4] 微信 Android 团队手把手教你高效监控 ANR
[5] Input 系统—ANR 原理分析 - Gityuan
[6] 彻底理解安卓应用无响应机制 - Gityuan
[7] 理解 Android ANR 的触发原理 - Gityuan