Android ANR触发机制及日志分析

1.ANR

Android系统要求一些事件在一定时间内完成,如果超过预定时间未得到有效响应或响应时间过长,就会造成ANR(Application Not Responding应用程序未响应)。

Android中有4种ANR发生场景:

①点击事件(按键和触摸事件):点击事件在5s内未被处理,日志描述为Input event dispatching timed out。

②服务Service: 前台Service20s内、后台Service 200s内未完成启动,日志描述为Timeout executing service。

③广播BroadcastReceiver:前台广播10s内、后台广播60s内,onReceive()在规定时间内没处理完,日志描述为Timeout of broadcast Broadcast Record。

注意,前台广播的ANR时间是10s内onReceive()没有执行完就提示,这是在没有点击触摸事件导致ANR的前提下才是10s,否则会先触发点击事件的ANR,onReceive()有可能执行不到10s就发生 ANR,所以不要在onReceive()处理耗时操作。

④内容提供者ContentProvider:publish在10s内没处理完,日志描述为Timeout publishing content providers。

这4种ANR的触发方式分为两种:通过handler的延迟机制触发ANR和Input事件触发ANR。其中Service、BroadcastReceiver、ContentProvider都是通过Hander机制触发ANR。

ANR产生需要同时满足三个条件:

①主线程:只有应用程序的主线程响应超时才会产生ANR;

②超

猜你喜欢

转载自blog.csdn.net/zenmela2011/article/details/128576128