ANR产生原因
出现ANR一般有以下几种原因:
-
KeyDispatchTimeout(常见)
input事件在5s内没有处理完成
logcat日志关键字:Input event dispatching timed out -
BroadcastTimeout
前台Broadcast:onReceiver在10S内没有处理完成发生ANR。
后台Broadcast:onReceiver在60s内没有处理完成发生ANR。
logcat日志关键字:Timeout of broadcast BroadcastRecord -
ServiceTimeout
前台Service:onCreate,onStart,onBind等生命周期在20s内没有处理完成发生ANR。
后台Service:onCreate,onStart,onBind等生命周期在200s内没有处理完成发生ANR
logcat日志关键字:Timeout executing service -
ContentProviderTimeout
ContentProvider 在10S内没有处理完成发生ANR。
logcat日志关键字:timeout publishing content providers
典型的ANR场景
1)主线程频繁进行IO操作,比如读写文件或者数据库;
2)硬件操作如进行调用照相机或者录音等操作;
3)多线程操作的死锁,导致主线程等待超时;
4)主线程操作调用join()方法、sleep()方法或者wait()方法;
5)耗时动画/耗资源行为导致CPU负载过重
6)system server中发生WatchDog ANR;
7)service binder的数量达到上限