欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android应用ANR如何分析

程序员文章站 2022-07-14 17:23:18
...

Android应用卡死如何分析

Android应用在使用过程中,常常会出现应用卡死无响应的情况,那么针对此类的问题,我们应该怎么去分析呢?

应用ANR的几种类型

首先,我们需要明确,应用发生ANR类问题,其原因可能是应用自身的问题,也可能是系统侧问题,也有可能是测试工具引发的。举个栗子,我们在测试稳定性的时候,拉起的Activity都是随机的,但是有些Activity的拉起是需要前一个页面参数的,若直接拉起,就会出现应用ANR问题,这样的问题就不能归结于应用,而属于Monkey特有问题归类,其他类问题比如因虚拟机重启导致的故障,又可以归类为系统自身问题,所以明确ANR类问题的界定及分析方法,有助于我们快速界定问题种类,从而简化开发的工作量。

那么ANR类问题在哪些场景下会触发呢?

应用层:
1、应用主线程阻塞
2、应用Activity切换超时
3、焦点窗口异常(系统侧也会出现此类问题)

系统侧:
1、系统线程异常
2、Binder线程、系统探针异常

上面这些只是简单罗列出目前ANR常见的几类问题,那么我们就以上几类问题先来简单分析下ANR类问题应该如何分析。

1、应用主线程阻塞

应用主线程我们有时也称之为“UI线程”,这个比较简单,我们在分析应用的时候,根据日志中ANR时间点找到对应线程,查看应用的线程此时在做什么操作,如果发现此时的线程正在处理一个消息,而却一直没有完成,就会出现应用ANR。分析的思路就是先确定问题发生时间点,然后去确定主线程,看看此时主线程是否有异常

2、应用Activity切换超时

关于应用Activity切换的问题,这类问题也是同样的思路,先根据日志找到问题发生的时间点,然后找到对应的对应的包名、进程号、正在处理的事件,以及处理时长,根据上面的信息来判断是处于那种情况下的切换导致Activity切换过长导致的ANR

3、应用窗口异常

窗口异常问题更容易分析,从日志中我们可以清晰的看到有“not focus on window”的字段,还是根据应用包名,进程ID来判断首先是否是应用自生的问题,是则进行深入分析,看下是在哪个页面触发了此类场景

4、应用锁

最后我们在来看下应用锁的问题,这类问题在ANR中也非常常见,在日志中我们可以搜索“waiting to lock”的字段,这类问题我们在分析的时候,关注喜爱Binder对端调用栈的信息,以此来分析是应用的哪个线程在等待什么锁,又是什么线程在持有这把锁

这里先简单的梳理下我们在遇到ANR类问题的一点分析思路,后续我们在从实例中分析ANR类问题。