anr的分类
当前的事件没有机会得到处理(即主线程正在处理前一个事件,没有及时的完成或者looper被某种原因阻塞住了)。当前的事件正在处理,但没有及时完成.
ANR 的全称是 Application No Responding,即应用程序无响应,具体是一些特定的 Message (Key Dispatch、Broadcast、Service) 在应用的UI线程(主线程)没有在规定的时间内处理完,进而触发 ANR 异常。
1.KeyDispatch Timeout :
- 按键或触摸事件在特定时间内无响应,超时时间5秒。
- 超时时间是在ActivityManagerService类中定义的。
2.Broadcast Timeout:
- BroadcastReceiver在特定时间内无法处理完成。
- 前台广播10秒,后台广播60秒。超时时间是在ActivityManagerService类中定义的。
- 确保BroadcastReceiver在主线程中执行的逻辑简短且迅速,复杂的逻辑应当委托给异步任务处理。
3.ServiceTimeout
- Service 在规定时间内无法处理完成操作,即会报出服务超时.
- 这类 ANR 同样没有提示框出现。超时时间,前台 Service 是 20s,后台 Service 是 200s。
- 对于长时间运行的服务,考虑使用IntentService或JobScheduler等方式异步执行任务,防止因超时而引发ANR。
ANR常见原因
1.耗时操作
- 在Android应用的主线程(UI线程)中执行了过于耗时的操作,例如大量的数据处理、网络请求、数据库访问等。
- 这些操作会阻碍主线程的正常消息循环,进而导致界面无法及时刷新响应用户操作。
2.同步锁等待
- 主线程在获取或释放同步锁时长时间等待。
- 例如由于其他线程持有锁而导致主线程被挂起,同样会导致ANR。
3.IO/CPU密集型操作
- 大量占用CPU资源或等待IO操作完成导致主线程被抢占,不能及时响应触摸事件或其他UI事件。
- 如前台在玩游戏,可能会导致你的后台广播被抢占。
- 提高数据处理效率,减少不必要的计算与内存分配,尤其是对循环、递归等易产生性能瓶颈的地方进行优化。
4.复杂的布局渲染与内存泄漏
- 布局层级过深或包含大量的视图元素,可能导致界面渲染缓慢。
- 未及时释放的资源占用过多内存,导致应用运行缓慢。
- 可以使用Hierarchy Viewer工具 检查布局层级,优化布局结构,减少不必要的嵌套。
- 内存泄漏会导致应用占用过多内存,影响性能。可以使用MAT工具 检查内存泄漏,并及时修复。
ANR问题定位
1.日志分析(logcat)
- 查看anr日志
- 利用Android Studio自带的Logcat工具,搜索关键词"ANR"或"Input dispatching timed out",找到ANR发生时刻的日志记录。
- 通常会包含有错误报告和堆栈信息,如导致ANR的进程、线程和代码位置。
- 解析teaces.txt
- ANR发生时,系统会在设备上生成traces.txt文件,它记录了所有线程的状态。
- 通过ADB工具将其导出分析,可以定位到具体哪个线程可能引起阻塞。
2.使用性能分析工具
- Android Profiler:实时监控CPU、内存、网络、磁盘I/O等资源使用情况,寻找可能导致ANR的性能瓶颈。
- Systrace:系统层级的跟踪工具,能够追踪系统各组件间的交互和调度,帮助找出主线程阻塞的源头。
3.anr检测工具
- 使用Android提供的ANR检测工具,如Traceview。
- 可以获取应用程序的执行堆栈信息。通过分析堆栈信息,可以准确找到导致ANR的代码位置。
4.调试和单步执行
- 通过在开发工具中进行调试和单步执行,可以逐步跟踪代码的执行过程。
- 找到导致ANR的具体位置和原因。