【精】android anr专题

彻底理解Android ANR机制 一篇就够了 不论从事安卓应用开发,还是安卓系统研发,应该都遇到应用无响应(ANR,Application Not Responding)问题,当应用程序一段时间无法及时响应,则会弹出ANR对话框,让用户选择继续等待,还是强制关闭。绝大多数人对ANR的了解仅停留在主线程耗时或CPU繁忙会导致ANR。面试过无数的候选人,几乎没有人能真正从系统级去梳理清晰ANR的来龙去脉,比如有哪些路径会引发ANR?有没有可能主线程不耗时也出现ANR?如何更好的调试ANR? 阅读详情

背景:

只有主线程才可以更新ui,因为为了防止多线程访问变量导致错误的问题,所以更新ui全部是在主线程中。我们可以通过handler 或者view 的post 的方法进行更新,还有runinUiThread等。

 

github: https://github.com/kodulf/ANRDemo

 

发生原因:

主线程执行时间超过5秒钟,broadcast 的onReceiver 方法执行超过了10秒钟,service 执行时间超过了15秒

Activity----->5秒
Broadcast----->10秒
Service----->20秒
会报ANR,都是在主线程中运行的

可能是下载的操作是在主线程直接进行操作了,例如broadcast的onreceiver 里面执行的时间太长了,service

 

举个例子:

比方kfc, 前面点餐员,如果你还让点餐员去给你拿餐,人少的时候还可以,可以快速的响应你,如果人多的时候,那么,可能就会出现后台做不过来,需要点餐员在那边等着然后才能给你拿。

正确的做法应该是,点餐员就负责给你点餐,然后后面有专门的人负责给你去餐,点完餐在旁边等待就好了,不要打扰后面的人点餐。

 

解决思路:

1: 当前的怎么check log 

如果出现了anr,那么会有两个地方的log,

1.1 首先就是logcat 里面的log,我们可以定位到线程的id号

1.2 在/data/anr/下面会有具体的anr的日志。这个可以定位到具体的是哪一个线程,哪一行报的错

但是在user版本上面(不可以root),我们是访问不到这个路径的, 那么我们可以通过adb bugreport 来将当前的bug内容集中起来,然后将该包复制到本地解压后,找到路径FS->data->anr  这里的FS 应该就是filesystem的缩写吧。

例如1.1 上面定位到了pid 为2008, 那么 在这个文件里面搜索这个pid ,我们可以定位到相应的suspend 类似的信息,

 

2: 怎么debug

如果要去debug当前的一些方法执行了多长时间,那么我们可以有3种方法获取到相应的trace文件:

第一获取trace文件的方法,在方法里面添加

Debug.startMethodTrace(“customer”)

Debug.stopMethodTrace()

如果是使用Debug.startMethodTrace(“test”) 一般保存在sdcard 里面,

 

 

 

第二个获取trace的方法,在profile的时候点击cpu,

第三发获取trance 的方法,可以通过monitor 里面的两个地方获取,

获取第一个,点击profile 打开后, monitor 那边的就可以显示红色了

 

获取第二个,点击图表的图片,会生成一个5秒的trace文件。

 

 

通过trace文件我们可以定位到某一个方法到底使用了多长时间。

具体的可以去参考里面看

 

 

参考:

https://v.youku.com/v_show/id_XNzIxNjM1NDg4.html?from=y1.7-2 

https://blog.youkuaiyun.com/Rodulf/article/details/50585174

https://blog.youkuaiyun.com/yinzhijiezhan/article/details/80167283 

https://www.jianshu.com/p/fa962a5fd939

https://www.jianshu.com/p/5efbc1603a4a

 

 

 

-------------------------------------------------draft--------------------------------

为什么只有一个线程才能更新ui, 为了防止多线程导致数据的错误。所以所有的ui更新都是通过主线程来做的。

 

只有一个线程可以修改ui资源

主线程的代码阻塞了,那么代码将会无法响应

这种卡住的行为就是anr,

如果主线程超过5秒没有响应

is not response。

 

其实不是为了说 为了防止anr,而做一些操作,而是为了给用户更好的体验,例如按钮的点击,如果出现了sleep10秒的话,那么就会出现点击然后没有回弹的,没有反应的情况,所以anr 的出现主要是给用户很差的体验,体验非常的糟糕

 

 

耗时操作是不可能避免的

1: 网络链接和网络数据的获取,例如获取图片,理想情况下可能几十毫秒。

2: 对存储器的读写

3: 大量的数据的计算,获取全部应用的界面

 

可能网络不稳定, 磁盘在忙,cpu 被占用。

 

所以如果需要网络链接或者是读取数据,最好是在子线程中去执行。 然后

任何阻塞的操作都是有阻塞超过5秒的可能, 即便是小于5秒,也会导致某个时间里面用户无法操作的

ui主线程负责事件的监听和绘制,因此,必须要保证ui线程能够随时响应用户的需求

 

如果是使用Debug.startMethodTrace(“test”) 一般保存在sdcard 里面,

 

 

所以说耗时操作不要在主线程执行的原因就是这个了。

traceview

https://blog.youkuaiyun.com/yinzhijiezhan/article/details/80167283

点击profile 打开后, monitor 那边的就可以显示红色了

 

 

 

二.ANR机制的实现原理:

文章:http://gityuan.com/2016/07/02/android-anr/从源码角度详细的分析了ANR机制实现的原理。对于上一章讲到的1-4中情况,分别找到了其源码中是如何实现的,对于每一种大概原理如下:1.在进行相关操作调用hander.sendMessageAtTime()发送一个ANR的消息,延时时间为ANR发生的时间(如前台Service是当前时间20s之后)。2.进行相关的操作3.操作结束后向remove掉该条message。如果相关的操作在规定时间没有执行完成,该条message将被handler取出并执行,就发生了ANR。
下面以BroadcastReceiver为例详细介绍:
BroadcastQueue.processNextBroadcast()

 


 

Android ANR原因和流程总结 1、概述 ANR即Application Not Responding(应用程序无响应),一般在ANR的时候会弹出一个应用无响应对话框,同时会候产生一个日志文件trace.txt,位于/data/anr/文件夹下面,trace文件是Android Davik虚拟机在收到异常终止信号时产生的,最常见的一个触发条件就是Android应用中产生了FC(force close)。由于该文件的产生是在DVM中的,所以只有运行DVM实例的进程才能产生该文件,也就是说只有Java代码才能产生该文件,App应用的Nativ 阅读详情

相关推荐

android anr定位分析,Android ANR产生的原因以及其定位分析

前言ANR是Android中一个独有的概念,它的全称是Application Not Responding(应用程序无响应)。相信从事Android开发的同学,或多或少都遇到过,对于高质量的代码,ANR在开发者自测过程中可能不会经常遇到,但一旦测试人员进行Monkey测试,ANR出现的概率就比较高了,如何快速分析定位并解决,是开发者的必修课。ANR的直观体验是用户在操作APP的过程中,感觉界面卡顿...

weixin_42525385的博客 4019

Android获取ANR的traces.txt文件

数据线连接开启USB调试的手机,执行以下CMD命令,然后在手机的文件管理就可以找到traces.txt文件 adb shell cat /data/anr/traces.txt > /sdcard/traces.txt exit adb pull /sdcard/traces.txt

Jeyden_827的博客 1668

4.UE数字人工程运行逻辑及程序逻辑

UE数字人工程运行逻辑及程序逻辑

6086

Andriod trance日志分析的思路

trance 日志的分析

xuedaqian123的博客 1675

科研党必备:5个高效查找论文开源代码的宝藏网站(附实战技巧)

本文为科研工作者推荐5个高效查找论文开源代码的宝藏网站,包括ResearchCode和PapersWithCode等工具,提供实战技巧如进阶搜索语法和代码质量评估体系,帮助快速定位高质量实现并提升复现效率。特别分享隐藏代码库的检索方法和智能工作流配置,助力科研党高效完成论文复现。

weixin_28829629的博客 401

给STM32F4装上耳朵:用麦克风模块和Keil MDK实现你的第一个语音指令(附完整代码)

本文详细介绍了如何使用STM32F4开发板和麦克风模块实现简单的语音指令识别系统。通过Keil MDK开发环境配置、ADC音频采样、语音活动检测和模板匹配算法,开发者可以快速构建响应'开灯'、'关灯'等基础指令的语音交互方案。文章包含完整代码实现和调试技巧,特别适合STM32初学者入门语音识别领域。

weixin_29171087的博客 434

Android系统 抓trace方法(手机及车机)

andorid抓取trace的三种方法,方便简单。

weixin_41872439的博客 7896

Python程序—定子故障三相永磁同步电动机振动与电流数据集

1.0 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为2.26%: 匝间短路故障,严重度为2.70%: 匝间短路故障,严重度为3.35%: 匝间短路故障,严重度为4.41%: 匝间短路故障,严重度为6.48%: 匝间短路故障,严重度为12.17%: 匝间短路故障,严重度为21.69%1.5 kW 电机匝间短路故障数据: 正常匝间短路振动数据: 匝间短路故障,严重度为1.57%: 匝间短路故障,严重度为1.88%: 匝间短路故障,严重度为2.34%

m0_66465741的博客 1318

(二十一)Android内存、性能优化

性能优化的方法 布局优化:利用、以及ViewStub优化       标签只支持以android:layout开头的属性,若设置了android:layout_*属性,则必须有android:layout_width(height)属性。也可设置   id,若布局也有id,以include指定的id为准。       标签可以减少布局的层级。        ViewStub继承了View,

kerrysimon的博客 360

计算机国际会议中的proceedings、conference、paper、workshop、demo:如何区分与选择?

本文详细解析了计算机国际会议中的核心概念:Conference(会议)是学术交流的主舞台,Paper(论文)是研究成果的书面呈现,被接收后收录于Proceedings(会议论文集)。Workshop(研讨会)聚焦前沿细分领域,Demo(演示)则侧重系统与工具的可交互展示。文章为研究者根据自身阶段与工作类型,如何区分与选择投稿目标提供了实用指南。

weixin_29269441的博客 562

python基于pingouin统计分析:rm_corr计算两个变量之间的重复测量相关性(Repeated measures correlation、plot_rm_corr函数可视化重复测量相关性图

python基于pingouin包进行统计分析:使用rm_corr函数计算两个变量之间的重复测量相关性(Repeated measures correlation)、plot_rm_corr函数可视化重复测量相关性图

statistics+insight+vista+power 679

android trace、backtrace文件和火焰图的抓取与查看方法

android trace和backtrace文件的抓取与查看方法

yimelancholy的博客 7127

《爬虫和逆向教程》 - 专栏介绍和目录

本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。

数据知道的博客 2万+

Android中ANR的分析和解决

关于Android中ANR问题的分析和解决

AfinalStone的专栏 1万+

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

本教程概述了LC-MS/MS在代谢组学和脂质组学数据分析中的应用流程。首先介绍了样本的采集、提取和LC-MS/MS分析,随后详细阐述了质谱数据的预处理、峰值识别、特征注释,以及数据标准化和统计分析的重要性。特别强调了使用XCMS和CAMERA进行数据对齐和加合物识别,以及利用MultiABLER和LipidFinder进行数据过滤、插补和标准化处理。此外,还介绍了如何应用EigenMS算法进行数据标准化,以及如何使用Limma包进行差异分析。整个流程旨在提高数据质量,确保分析结果的准确性和可靠性,为后续的生

专注生信领域 1954

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

安卓ANR问题最全解析

安卓ANR问题最全解析

似霰的博客 7746

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最全面的安卓ANR

最全面的安卓ANR 一、什么是ANR? 1、概念 应用程序无响应(ANR:Application Not Responding):在一定的时间内没有做完响应的处理。 注意: 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。如响应输入的事件5S,broadcastReceiver是10S,service是20S,如果这...

anwanfei的博客 4698

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

安卓ANR详解

最全面的安卓ANR 一、什么是ANR? 1、概念 应用程序无响应(ANR:Application Not Responding):在一定的时间内没有做完相应的处理。 注意: 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。如响应输入的事件时间超过5S,broadcastReceiver超过10S,service超过20S,就会引起anr。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。 二、如何避免ANR? 1

暴走的山交君的博客 6485

Android ANR问题总结

一、概述ANR(Application Not Responding), 如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误。如果应用位于前台...

内核工匠 1万+

Android中的anr定位指导与建议

如何快速定位安卓的anr问题

StramChen的博客 4241

安卓开发-ANR 机制

本文深入解析安卓开发中的ANR(应用无响应)问题。ANR是系统对主线程阻塞的警告机制,当主线程处理用户交互或UI更新超时(Activity5秒、BroadcastReceiver10秒、Service20秒)就会触发。文章通过典型考题分析各类场景,指出子线程执行不会触发ANR,强调应将耗时操作(网络请求、IO读写等)移至子线程。同时给出实战避坑建议:避免主线程耗时操作、广播接收器轻量化处理、合理配置线程池、监控ANR日志等。掌握ANR机制有助于开发流畅稳定的应用,提升用户体验。

m0_74296492的博客 1016

Android ANR分析总结

Android ANR分析总结 ANR(Application Not Responding)是Android系统检测到主线程长时间阻塞时触发的机制。常见原因包括主线程执行耗时操作(IO、网络请求等)、锁竞争和CPU资源不足。系统对不同场景设置了超时阈值(如输入事件5秒、前台广播10秒等)。 分析ANR的关键步骤: 查看logcat日志,搜索"ANR in"获取关键信息(如报错位置、超时原因) 检查/data/anr目录下的堆栈文件(需root权限),重点关注"main&quo

wenzhi的博客 3371

Android ANR详解

一、什么是ANR? ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。 那么哪些场景会造成ANR呢? Service Timeout:前台服务在20s内未执行完成; BroadcastQueue Timeo...

Fighting_初心的博客 1万+

安卓InputDispatching Timeout ANR 流程

输入事件(包括按键和触屏事件)在5秒内无响应,就会弹出 ANR 提示框,供用户选择继续等待程序响应或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。这一类是指因为消息处理超时而发生的 ANR,在 log,会看到 “Input dispatching timed out (Waiting because the focused window has not finished processing。

mike_jun的博客 3227

Android ANR 实现机制详解

ANR(Application Not Responding),即应用程序无响应,Android 系统指定某些事件需要在规定时间内完成,如果超过预定时间还能未能得到有效响应,就会造成 ANR。具体表现为,应用位于前台时,系统会向用户显示一个对话框,如下图所示。用户可以选择“wait”让程序继续运行,也可以选择“Close app”强制关闭。

话唠扇贝的博客 1501
上一篇: [转]就这一次看懂TraceView
下一篇: 转:adb获取android手机系统版本,已对应的api版本和硬件相关信息
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值