当前位置:恩施知识网 > 科技创新 > 正文

浅析Android系统稳定性中应用程序ANR无响应的原因

稳定性问题简述Android 的稳定性是 Android 性能的一个重要指标,它也是 App 质量构建体系中最基本和最关键的一环;如果应用经常崩溃,或者关键功能不可用,那显然会对我们的留存产生重大影响
所以为了保障应用的稳定性,我们首先应该树立对稳定性的正确认识从表现来看有:死机重启自动关机无法开机冻屏黑屏闪退无响应等等情况
这也就说明了稳定性问题比较杂,且很多是概率性问题,没有统一处理方式,需要针对具体的问题,具体分析
一般来说:必现的问题较易解决,针对当前代码添加各种调试
稳定性问题简述

Android 的稳定性是 Android 性能的一个重要指标,它也是 App 质量构建体系中最基本和最关键的一环;如果应用经常崩溃,或者关键功能不可用,那显然会对我们的留存产生重大影响

所以为了保障应用的稳定性,我们首先应该树立对稳定性的正确认识

从表现来看有:死机重启自动关机无法开机冻屏黑屏闪退无响应

等等情况

这也就说明了稳定性问题比较杂,且很多是概率性问题,没有统一处理方式,需要针对具体的问题,具体分析

一般来说:必现的问题较易解决,针对当前代码添加各种调试 log ,一步步 debug 去定位,过程虽然可能慢点,但一般都会解决

针对偶发性的概率问题,则较为麻烦,依赖于大量的测试复现,然后统计 分析当前抓取到的 events 、system 等 log 中,找到复现的步骤,然后去定位;且针对与这种概率问题,最好能够拿到当时的现场,所以有时候需要将 tombstone 或者 ANR 、crash 转为 ANR 去处理

从技术层面来划分:

无外乎两大类:长时间无法执行完成(Timeout) 以及异常崩溃(crash). 主要分类如下所示:

ANRWatchdogCrash、界面、流程异常TombstonePanic接下来我们细说一下 ANR

应用程序无响应即 Application not Responding ,简称“无响应”或 “ANR”

为什么会有 ANR?

如上所述,ANR 的产生需要同时满足三个条件:

主线程:只有应用程序进程的主线程响应超时才会产生 ANR超时时间:产生 ANR 的上下文不同,超时时间也会不同,但只要在这个时间上限内没有响应就会 ANR输入事件/特定操作:输入事件是指按键、触屏等设备输入事件,特定操作是指 BroadcastReceiver 和 Service 的生命周期中的各个函数,产生 ANR 的上下文不同,导致 ANR 的原因也会不同

ANR 机制本身就是为了防止差的用户体检,是完全 Android 系统工程师为大家埋下的雷;这个雷既然是工程师设计的,那就可以被工程师控制

比如像我们通常说按键 5s 内时间处理不完的 ANR ,这个 5s 在一些低端手机上被修改为 8s 甚至 10s ,还有就是 ANR 产生后,相关的“现场”是会被保留下来比如在 events log、main log、system log 上有相关的 ANR 信息;再比如出现 ANR 的时候生成的 trace 文件,bugreport 中也有一些有用的信息,帮我们分析 ANR 产生的原因

现在好多平台 cpu 都是多核,cpu 达到 100% 都不能说明就是系统卡顿导致的 ANR

还要说明,系统 ANR in 往往比 event log 中的 am_anr 会慢很多;具体慢多少需要根据场景而定,所以建议以 event log 中的 am_anr 作为时间窗口起点比较好

那ANR in 能看到哪些信息呢?Reason: ANR 原因,这个在 evnent log 中也可以看到作用不大;原因可以定位 ANR 的时间窗口,比如按键类型的 ANR 那分析的时候只需要在 event log 的am_anr 之前 5s 的时间窗口中分析就行Load: 0.06 / 0.05 / 0.05 cpu 负载,这个可以看到是否是系统性能整体慢的参考指标。但是各个平台这个参数又不统一。所以参考价值不大TOTAL: 这个是整体 cpu 占用情况如果能够看到 kernel 占用比较多,可以考虑是否是系统问题那如何证明系统卡顿导致的 ANR 呢?

如果是由系统引起的卡顿在 event log 中搜索dvm_lock_sample,因为往往在系统卡顿的时候 dvm_lock_sample 会打印出系统主线程的一些主要方法耗费了多少时间

dvm_lock_sample: [system_server,1,Binder:1614_A,22,AlarmManagerService.java,1072,-,2496,4] (进程名,是否主线程1是0否,线程号,花费时间,文件名,申请锁行数,持锁文件名,持锁行数,采样频率)

今天关于 ANR 的相关技术知识点就分享到这里了;关于 ANR 的技术问题,我们还要去好好的学习剖析;因此我把工作中遇到的性能卡顿问题,以及对网上大部分的资料的收集和整理,最终整合出了一份 《Android 高工必备性能优化》学习文档,有需要这份文档的朋友,可以 私信 发送 “进阶” 即可 免费获取

内容展示如下:

Android 高工必备性能优化 目录:

UI 布局优化优化思路优化方案选择合适的布局类型尽可能少用 wrap_content用 SurfaceView 或 TextureView 代替普通 View使用 RenderJavascript使用 OpenGL 绘图布局调优工具

完整版 Android 高工必备性能优化学习文档获取方式:可以 私信发送 “进阶”即可 免费获取卡顿优化和布局优化卡顿分析刷新率PerfDogCPU Profile布局优化过度绘制解决过度绘制层级优化使用 mergeViewStub不要在 onDraw 里创建对象异步加载布局

崩溃优化崩溃的收集ANR应用退出崩溃处理崩溃现场崩溃分析系统崩溃

完整版 Android 高工必备性能优化学习文档获取方式:可以 私信发送 “进阶”即可 免费获取网络优化网络指标用户体验网络监控Network MonitorCharles 抓包工具优化 DNS 解析连接池复用数据压缩弱网优化网络安全

储存优化Android 存储方式SharedPrefence多进程问题 -> mmkv已经有 xml/json,为什么要用 protobuf项目中使用 protobuf语言规范字段约束编码协议

由于篇幅有限,资料就不做完全展示了;有需要这份《Android 高工必备性能优化》 学习文档 的朋友,可以 私信 发送 “进阶” 即可 免费获取

技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面

加油!各位 Android 开发者们

浅析Android系统稳定性中应用程序ANR无响应的原因

Android中的ANR异常如何分析又该怎么去避免ANR

引发ANR的原因: 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR: 1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2.BroadcastReceiver在10秒内没有执行完毕 造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。 潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用 Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。

浅析Android系统稳定性中应用程序ANR无响应的原因

Android中的ANR异常如何分析又该怎么去避免ANR

ANR,是“Application Not Responding”的缩写,即“应用程序无响应”。系统会向用户显示一个对话框,用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
在Android中,应用程序的响应是由Activity Manager和WindowManager系统服务监视的 。当它监测到A、B、C情况中的一个时,Android就会针对特定的应用程序显示ANR:
A.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)--主要类型
B.BroadcastReceiver在10秒内没有执行完毕
C.Service在特定时间内(20秒内)无法处理完成--小概率类型
造成ABC的原因有很多,比如在主线程中做了非常耗时的操作,如下载,io异常等。还需要注意的是产生这种ANR的前提是要有输入事件,如果用户没有触发任何输入事件,即便是主线程阻塞了,也不会产生ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了。
免责申明:以上内容属作者个人观点,版权归原作者所有,不代表恩施知识网立场!登载此文只为提供信息参考,并不用于任何商业目的。如有侵权或内容不符,请联系我们处理,谢谢合作!
当前文章地址:https://www.esly.wang/keji/16592.html 感谢你把文章分享给有需要的朋友!
上一篇:北京三个地方标准征意见餐饮加工人员工作中不应玩手机 下一篇:什么是彩信跟短信有什么区别

文章评论