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类问题。