ANR分类及处理

ANR是Application Not Responding的缩写。
在Android系统中,系统服务WindowManagerService和ActivityManagerService会监视应用进程的响应性。如果一段时间没有响应,系统会弹出对话框提示用户是否选择关闭该程序或是继续等待。
一般说来,ANR都是由用户输入来驱动的。举例:一个应用的UI线程正在进行一个耗时操作(如访问网络,进行一些缓慢的磁盘操作,执行没有优化过的SQL查询,大量写入数据到数据库等等),此时应用阻塞了I/O操作,使得系统无法处理用户的输入事件,当触发timeout条件时导致ANR。
产生的根由:
主线程:1.耗时网络访问
2.当有大量数据读写操作时再请求数据读写
3.数据库操作(比如其他大数据量应用访问数据库导致数据库负载过重时)
4.硬件操作(比如Camera)
5.调用thread_join() / Sleep() / Wait() 或者等待locker的时候
6.Service binder数量达到上限
7.在system_server中发生WatchDog ANR
8.Service忙导致超时无响应
子线程:1.子线程持有lock,导致主线程等待lock超时
2.子线程终止或者崩溃导致主线程一直等待
按产生原因对ANR问题分类
通常,在如下三种情况下,Android会报出ANR错误:
一、输入事件响应超时(主要类型):主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件

二、广播接收处理超时:BroadcastReceiver 没有在10秒内完成返回

三、 Service服务处理超时(小概率事件):Service在20秒内没有执行完成应用发起的service请求
第一类:
主线程 (“事件处理线程” / “UI线程”) 在5秒内没有响应输入事件,KeyDispatchTimeout:
在ActivityManagerService.java中的超时常量定义
// How long we wait until we timeout on key dispatching.

猜你喜欢

转载自blog.csdn.net/qq_42894864/article/details/104065875
ANR