Android ANR 的实例分析

Posted on By Qinggai Huang

trace文件获取

标准做法是adb pull /data/anr/traces.txt
如果碰到没有权限的情况,用adb bugreport生成,然后adb pull生成目录下的文件出来,解压会得到一个bugreport-***.txt的文件,这个文件里面就有trace信息,文件里面搜VM TRACES AT LAST ANR定位最后一次anr的trace信息。

主线程忙等

看第一个ANR的trace,如下图

ANR的trace

上图可以看出UI线程lock 0x0799e5b8然后又在wait 0x0799e5b8,是一个Object调用wait后等待notfiy。ANR发生的时候,UI线程正在等这个notify,但是没有等到,这个时候在运行的是at com.a.b.c.d(c.java:746),可以得出结论是这个里面执行了一个耗时操作。

死锁

下面看一个死锁的trace

ANR的trace2

上图可以比较容易看出线程Thread-0锁住了<0x00000007d56540a0>在等<0x00000007d5656180>。而Thread-1锁住了<0x00000007d5656180>在等<0x00000007d56540a0>,所以这两个线程就造成了死锁。