安卓系统中的ANR简述

  

ANR是Application  Not 回应,指应用程序未响应,安卓系统如果超过预定时间未能得到有效响应或者响应时间过长,都会造成ANR,因为Android系统对于一些事件需要在一定的时间范围内完成.ANR由消息处理机制保证,   Android在系统层实现了一套精密的机制来发现ANR。

  

  

  

ANR机制主体实现在系统层,系统进程设计了不同的超时限制来跟踪消息的处理。所有与ANR相关的消息,都会经过系统进程调度,然后派发到应用进程完成对消息的实际处理只一旦应用程序处理消息不当,超时限制就起作用了,它会收集一些类似杯使用情况等信息并报告用户进程无响应情况

  

  <>强检测ANR的核心是消息调度和超时处理

  

而在应用中基本上只有四种情况会导致ANR

  
      <李>   

    Service 超时:服务在特定的时间内无法处理完成

      <李>   

    BroadcastQueue 超时:BroadcastReceiver在特定时间内无法处理完成

      <李>   

    ContentProvider 超时:内容提供者执行超时

      <李>   

    inputDispatching 超时:,按键或触摸事件在特定时间内无响应。

  

而整个ANR机制可以分为:ANR检测机制和ANR报告机制

  

  <强>服务检测机制

  

在ANR机制中,服务运行在应用程序的主线程,如果服务的执行时间超过20秒,就会引发ANR。

  

Android是通过设置定时消息实现监测服务超时的。定时消息是由AMS的消息队列处理的(system_server的ActivityManager线程)只AMS有服务运行的上下文信息,所以会在AMS中设置一套超时检测机制

  

  <强>输入事件检测机制

  

应用程序可以接收输入事件(按键,触屏,轨迹球等),当5秒内没有处理完毕时,则会引发ANR。

  

  <强> ANR报告机制

  

无论哪种类型的ANR发生以后,最终都会调用AppErrors.appNotResponding()方法,想用户或者开发者报告发生ANR了,表现为弹出提示框,提示用户该程序无法响应,打印相关日志

安卓系统中的ANR简述