ANR小记

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的具体位置和原因。
相关推荐
太空漫步112 小时前
android社畜模拟器
android
海绵宝宝_4 小时前
【HarmonyOS NEXT】获取正式应用签名证书的签名信息
android·前端·华为·harmonyos·鸿蒙·鸿蒙应用开发
凯文的内存6 小时前
android 定制mtp连接外设的设备名称
android·media·mtp·mtpserver
天若子6 小时前
Android今日头条的屏幕适配方案
android
林的快手8 小时前
伪类选择器
android·前端·css·chrome·ajax·html·json
望佑8 小时前
Tmp detached view should be removed from RecyclerView before it can be recycled
android
xvch10 小时前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
人民的石头14 小时前
Android系统开发 给system/app传包报错
android
yujunlong391914 小时前
android,flutter 混合开发,通信,传参
android·flutter·混合开发·enginegroup
rkmhr_sef14 小时前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb