Android ANR产生的原因以及解决方式

这篇具有很好参考价值的文章主要介绍了Android ANR产生的原因以及解决方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、什么是ANR

ANR是Android系统中的一种错误状态,全称为Application Not Responding,中文翻译为“应用无响应”。当Android系统检测到应用程序在一段时间内未能响应用户输入或无法执行主要的UI线程操作时,就会触发ANR错误。ANR是一种系统保护机制,旨在确保应用的响应性,防止用户在使用应用时遇到卡顿或无响应的情况。

二、ANR的分类

超时时间都是在AMS中定义的

ANR类型 解释 超时时间
InputDispatching Timeout 按键或触摸事件在特定时间内无响应 5秒
Broadcast Timeout BroadcastReceiver的onReceive方法在特定时间内无法处理完成。 前台广播在Android8.0之前10秒8.0之后15秒,后台广播60秒
Service Timeout Service在特定的时间内生命周期函数无法处理完成 前台服务20秒后台服务200秒
ContentProvider Timeout ContentProvider在特定的时间内没有完成发布 10秒

三、产生ANR的原因

主线程阻塞: 当应用在主线程执行耗时操作时,例如网络请求或复杂计算I/O操作,会导致主线程无法及时响应用户输入,触发ANR。

死锁: 多线程编程中,死锁可能发生,当一个线程等待另一个线程释放锁时,应用就会无法继续执行,导致ANR。

非法耗时操作: Android规定在主线程中不允许执行耗时操作,违反这一规定会触发ANR。

**同步Binder调用:**主线程在对另一个进程进行同步Binder调用,而后者需要很长时间才能返回。(如果我们知道调用远程方法需要很长时间,我们应该避免在主线程调用)

关于上述ANR的分析定位参照:Android造成ANR的常见原因及示例分析 - 简书 (jianshu.com)

四、上线后的App如何检测ANR

1.ANR WatchDog

既然 ANR 的原因是输入在定时间内没有响应,那么我们很自然地想到,向主线程发送一个任务,如果一段时间内没有被执行的话,就认为发生了 ANR

这个思路主要有以下几个问题

  1. 不准确,超时条件不一定会导致 ANR,例如,5 秒超时只是在 TouchEvent 未被消耗时发生 ANR 的条件之一,而其他条件则不一定是 5 秒。
  2. 漏检测:如果超时时间定为 5 秒,去检测 TouchEvent 的 ANR 存在一定的漏检测的概率(周期不同步。

2.信号监听思路

在上面介绍 ANR 总体流程时,我们注意到当 ANR 发生时会发送 SIGQUIT(通常为信号3)信号,那么我们通过监听这一信号不就可以实现 ANR 监控了吗?事实上 XCrash 与 Matrix 都是通过这种方式实现 ANR 监控的

在这里需要注意,默认情况下进程通过SignalCatcher监听SIGQUIT信号,进行堆栈转储生成 ANR Trace 文件。因此当我们监听SIGQUIT信号后,需要重新向SignalCatcher发送SIGQUIT

如果缺少重新向 SignalCatcher 发送 SIGQUIT 信号的步骤,Android System 管理服务(AMS)将一直等待 ANR 进程写入堆栈信息。直到超过20秒的超时时间,AMS 才会被迫中断,并继续后续流程。这将导致 ANR 弹窗的显示非常缓慢(因为超时时间为20秒),同时在 /data/anr 目录下也无法生成完整的 ANR Trace 文件。

这个思路主要有下面几个问题

当监听到 SIGQUIT 信号时,不一定是发生了 ANR。

Matrix 的文档中提到了两种误报的情况:

  1. 比如可能是其它进程 ANR 了,发生 ANR 的进程不是唯一需要进行堆栈转储的进程。系统会收集许多其他进程进行堆栈转储,用于生成 ANR Trace 文件
  2. 厂商或者是开发者自己发送的SIGQUIT信号,发送SIGQUIT信号其实是很容易的一件事情

因此我们需要在监听到信号时再进行一次检查:在 ANR 弹窗前,会给发生 ANR 的进程标记一个 NOT_RESPONDING 的 flag,而这个 flag 我们可以通过 ActivityManager 来获取

漏报情况处理

当进程被标记为 NOT_RESPONDING 时一定发生了 ANR,但是当进程发生了 ANR 时,不一定会被标记为 NOT_RESPONDING

Matrix 的文档中提到了两种漏报情况

  1. 后台ANR(SilentAnr): 后台 ANR 会直接杀死进程,不会走到标记状态的代码
  2. 厂商定制逻辑: 相当一部分机型(比如 OPPO、VIVO 两家的高版本 Android )修改了 ANR 的逻辑,即使是前台 ANR 也会直接杀死进程

Matrix 通过判断主线程在收到 SIGQUIT 信号时是否处于卡顿状态来判断当前是否发生 ANR

问题:

2 sp为什么会导致ANR

4项目上线后如何检测ANR(handle watchDog,信号机制)

参考连接:https://juejin.cn/post/7314135212355092491

https://juejin.cn/post/7229370243146727484文章来源地址https://www.toymoban.com/news/detail-859258.html

到了这里,关于Android ANR产生的原因以及解决方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android ANR & SWT

    ANR(Application Not Responding,即应用程序无响应)。在Android中,当应用程序在规定时间内没有处理完毕相应的事件,系统就会报出ANR。 ANR类型 InputDispatchingTimedOut:应用程序主线程在5s内没有完成用户的input事件 ServiceTimeout:应用程序没有执行完成service的bind/create/start/destroy/unbind操作

    2024年02月16日
    浏览(51)
  • 【Android】ANR

    目前也还没处理过anr,记录几篇学习过的anr文章。 今日头条 ANR 优化实践系列 - 设计原理及影响因素 今日头条 ANR 优化实践系列 - 监控工具与分析思路 今日头条 ANR 优化实践系列分享 - 实例剖析集锦 今日头条 ANR 优化实践系列 - Barrier 导致主线程假死

    2024年01月16日
    浏览(29)
  • Android 面试题 ANR 五

    🔥 什么是 ANR 🔥 ANR (Application Not Responding ) 应用无响应的简称,是为了在  APP 卡死时,用户 可以强制退出 APP 的选择,从而避免卡机无响应问题,这是 Android 系统的一种自我保护机制。 在 Android 中,应用程序响应由 Activity Manager 和 Window Manager 系统服务进行监视。 ANR(Applic

    2024年02月15日
    浏览(29)
  • Android Service启动ANR原理

        在Service组件StartService()方式启动流程分析文章中,针对Context#startService()启动Service流程分析了源码,其实关于Service启动还有一个比较重要的点是Service启动的ANR,因为因为线上出现了上百例的 \\\"executing service \\\" + service.shortName 的异常。      本文中所有源码都只粘贴关键代

    2024年02月15日
    浏览(30)
  • Android性能优化之游戏引擎初始化ANR

    近期,着手对bugly上的anr 处理,记录下优化的方向。 借用网上的一张图: 这里的anr 问题是属于主线程的call 耗时操作。需要使用trace 来获取发生anr前一些列的耗时方法调用时间,再次梳理业务,才可能解决。 问题1 java 调用栈: 从调用栈中发现onActivityResult()执行对游戏侧的

    2024年02月15日
    浏览(40)
  • Android 查看ANR和Crash日志(adb bugreport)

    今天测试那儿出了个ANR,我自己手机没问题,很烦,定位不了位置。 于是还是得用ADB连接来看一下,之前用,但是老是会忘记,今天总结一下。 ADB命令查看应用包名_adb查看包名命令_岁月不待人的博客-CSDN博客 上面的连接是之前用adb后写的一篇常用的一些密令总结。 ANR的排

    2024年02月13日
    浏览(54)
  • SurfaceView出现ANR:Surface has already been released的解决办法

    项目中有这样一种场景会引起SurfaceView出现ANR,在主Activity中创建并使用SurfaceView,然后不停的进入子ActivityB ,返回主Activity再进入子ActivityB这样循环,就会出现ANR的问题。 我通过查看SurfaceView源码发现了一个坑,其实很多人使用的姿势不对,他们没有出现ANR只是幸运而已。

    2024年02月01日
    浏览(27)
  • ANR系列(二)——ANR监听方案之WatchDog

    ANR的监控在Android6.0之前可以通过监听文件 data/anr/trace 读取trace信息来分析,但从6.0之后就被禁止了。随着Android的发展,手机里的ANR越来越多,对ANR的监控方案也就五花八门。 WatchDog是个开源的框架,是一个短小精悍的UI卡顿监测框架,只有2个源文件, ANRWatchDog 和 ANRError 。

    2024年02月14日
    浏览(26)
  • android studio gradle build running慢 卡住不动 失败 原因与解决方式

    主要原因是 gradle 构建时无法从 网络 获取需要的包或库。 将国外库替换为阿里云镜像库。 例如 google 对应的库是 maven { url ‘https://maven.aliyun.com/repository/google’ }

    2024年02月11日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包