ANR一般性分析方法

Android项目的ANR问题经常让开发者困扰。究其原因,有些ANR问题很难定位。

若ANR和普通crash一样,打出耗时操作的调用栈,那么想办法修复就好了。

最近项目中的ANR问题较为严重,相信每个快速膨胀的app都会经历这个时刻,总结一些经验供大家参考。

ANR原因

ANR是耗时操作造成。

若有A/B/C事件串行执行于UI线程,当C事件发生ANR时,说明A->B->C太耗时了,并不能确定耗时操作在哪个具体事件上。

ANR基本定位

ANR的有用信息,我们需要在trace文件中获取。

trace文件路径:data\anr\traces_packageName.txt

在trace文件中,我们能够看到如下信息

DALVIK THREAD(14)表明trace文件中收集了14个线程的信息与调用栈。

下面的"main"指的是主线程,我们分析"main"所在的片段即可定位ANR。

图中所示,调用栈指向了com.puff.test.MainActivity.onResume方法,这就是ANR发生的原因,调用到onResume方法时,超时了!

ANR定位不准

当跟随调用栈查看onResume方法时,我们发现唯一的操作便是耗时操作

onResume阻塞了2s,造成了ANR。但是Activity的超时需要5s未响应,看来ANR的原因不仅仅是onResume造成的。

我们继续跟踪onResume之前调用的onCreate与onStart

  

所以根据trace文件定位ANR未必能准确,trace只给出了造成ANR的直接原因,间接原因仍然需要分析。

ANR辅助定位——BlockCanary

通过trace文件能够确定发生ANR的位置,但只是压死骆驼的最后一根稻草。

而BlockCanary工具却能统计到过程中所有耗时操作(耗时阈值由自己设置)。

原理比较简单,通过替换Looper的Printer达到计算msg处理的耗时。

同时也提供了一些很有帮助的参数,譬如总耗时与线程耗时,可用内存等。

具体内容可详见 BlockCanary

ANR辅助定位——埋点

通过trace文件与BlockCanary工具基本上可以定位耗时操作了,不过仍然有些情况会让人困扰。

若query(*,*)是耗时操作,在onStart中调用了多次,造成了onResume产生ANR,那么虽然能定位query是耗时操作,却不能确定是哪个操作真正耗时。

方法内多次调用同一耗时操作,那么就果断埋点吧!

通过埋点统计操作用时,即可更准确定位耗时操作。

多次采样确定ANR耗时操作

ANR不好复现,耗时操作的耗时也不稳定,通过多次采样来确定耗时操作似乎已经是通用方案了。

若是层级较深或复杂操作才能触发耗时操作的,推荐使用iTestin工具进行自动化测试。

iTestin工具的功能非常丰富,常用的操作都可以通过iTestin来模拟进行,更多的内容就阅读文档吧http://i.testin.cn/

若是比较简单的操作,可以直接通过adb的shell命令进行自动化测试了。

譬如上例中onResume经常发生ANR,那么多次启动并关闭就可以多次采样了。

adb shell am start com.puff.test/com.puff.test.MainActivity

adb shell am kill com.puff.test

便可执行启动与关闭页面,我们再循环执行一定次数就可以采样了。

时间: 2024-10-21 02:32:28

ANR一般性分析方法的相关文章

【第二周作业】面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

书上的一些概念这里不再复述,仅谈谈自己通过阅读教材.上课听讲后自己的一些理解: 面向过程分析方法注重自顶向下,逐层分析,把整个软件系统的功能逐布分解,各个击破.可以用生活中的一个例子来加以理解——去食堂吃饭.到达食堂(比如琴湖食堂)后,要遵从排队——打饭——阿姨打菜——拿筷子——找位子坐好——开吃,整个过程强调顺序性,比如不拿筷子就坐下是不行的,除非拿手抓.面向过程就是将软件系统所需要实现的功能按照以上类似的思路逐步细分,一步一步要做什么都要分析清楚. 面向对象分析方法则注重分析整个系统的逻辑结

面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?

结构化分析方法的分析步骤:1 理解和分析当前的现实环境 已获得当前系统的具体模型 2 建立当前系统的逻辑模型 3 建立目标系统的逻辑模型 4 进一步完善目标系统的逻辑模型 面向对象分析方法:根据面向对象的过程模型 面向对象的需求分析从概念上分为问题分析和应用分析两个方面  问题分析:主要收集并确认用户需求 最后将信息链接最终建立关于对象的分析模型 应用分析:主要是动态描述系统中对象的合法状态序列 并用动态模型表达对象的动态行为 对象之间的消息传递和协同工作的动态信息 综上:结构化分析方法是先创建

日志分析方法概述(转)

原文:日志分析方法概述 日志在计算机系统中是一个非常广泛的概念,任何程序都有可能输出日志:操作系统内核.各种应用服务器等等.日志的内容.规模和用途也各不相同,很难一概而论. 本文讨论的日志处理方法中的日志,仅指Web日志.其实并没有精确的定义,可能包括但不限于各种前端Web服务器――apache.lighttpd.tomcat等产生的用户访问日志,以及各种Web应用程序自己输出的日志. 在Web日志中,每条日志通常代表着用户的一次访问行为,例如下面就是一条典型的apache日志: 211.87.

边界值分析方法

一.方法简介 1.定义:边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法.通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界. 2.与等价划分的区别 1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件. 2)边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况. 3.边界值分析方法的考虑: 长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种

测试用例设计白皮书--边界值分析方法

一.方法简介1.定义:边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法.通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界. 2.与等价划分的区别  1)边界值分析不是从某等价类中随便挑一个作为代表,而是使这个等价类的每个边界都要作为测试条件.  2)边界值分析不仅考虑输入条件,还要考虑输出空间产生的测试情况. 3.边界值分析方法的考虑:  长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对

Linux内核源码分析方法

  一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写.编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内.如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码.通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一

Multisim的电路分析方法

Multisim的电路分析方法:主要有直流工作点分析,交流分析,瞬态分析,傅里叶分析,噪声分析,失真分析,直流扫描分析, 灵敏度分析,参数扫描分析,温度扫描分析,零一极点分析,传递函数分析,最坏情况分析,蒙特卡罗分析,批处理分析,用户自定义分析,噪声系数分析.1.直流工作点分析(DC Operating):在进行直流工作点分析时,电路中的交流源将被置零,电容开路,电感短路.2.交流分析(AC Analysis):交流分析用于分析电路的频率特性.需先选定被分析的电路节点,在分析时,电路中的直流源将

《面向微博的社会情绪词典构建及情绪分析方法研究》学习笔记

1. 目的: 探索一种面向微博的社会情绪词典构建方法: 2. 步骤: 1)通过手工方法建立小规模的基准情绪词典: 2)利用深度学习工具 Word2vec对社会热点事件的微博语料通过增量式学习方法来扩展基准词典,并结合 HowNet词典匹配和人工筛选生成最终的情绪词典: 3. 试验阶段: 分别利用基于情绪词典和基于SVM的情绪方法对实验标注语料进行情绪分析: 4. 结果分析: 结果对比分析表明基于词典的情绪分析方法优于基于SVM的情绪分析方法,前者的平均准确率和召回率比后者分别高13.9%和1.5

面向过程分析方法与面向对象分析方法到底区别

个人理解面向过程分析方法,就是相当于流水线作业,它的关注点是事件的具体过程,比如大学生一天的事情就是,起床->洗脸.刷牙->吃早餐->上课->吃午饭->午休->上课->吃晚饭->做作业.消遣->睡觉,面向过程注重模块化,比如,吃饭模块,睡觉模块等等,它的流程清晰便于组织. 而面向对象的分析方法,侧重于对象,而不是流程,通俗一点就是不注重流程,还是大学生一天的做的事情,用面向对象的方法就会抽象出一个大学生的类,这个类包含了大学生的属性和行为,比如大学生能