写Android程序时,经常会遇到各种各样的问题导致应用闪退。下面就来总结下应用闪退时,我们有什么方法去定位问题。
首先我们应该用 adb logcat -v time 命令把日志打印出来,直接用AS的logcat也可以,只是有的时候logcat会出现清空日志的情况,还是adb命令的日志靠谱。
有了日志,可以通过查找以下几个字段来快速定位问题:
- Exception:查看所有发生异常的地方,看看是不是有没有捕获到的异常。
例如:下面这个异常就是日志打印出来的一个未捕获的异常,它可以准确地告诉我是哪个类的哪个方法,哪一行出了错误,这样就可以快速找到问题。
08-16 17:27:01.792 E/dalvikvm( 4392): threadid=1: thread exiting with uncaught exception (group=0x40a521f8)
08-16 17:27:01.822 E/System.err( 4392): java.lang.NoSuchMethodError: ****.setBackground
08-16 17:27:01.832 E/System.err( 4392): at android.view.LayoutInflater.rInflate(LayoutInflater.java:747)
08-16 17:27:01.832 E/System.err( 4392): at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
08-16 17:27:01.842 E/System.err( 4392): at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
ANR:查看应用是否出现了ANR的情况。
在Android中,程序的响应性是由Activity Manager与Window Manager系统服务来负责监控的。当系统监测到下面的条件之一时会显示ANR的对话框:
(1)对输入事件(例如硬件点击或者屏幕触摸事件),5秒内都无响应。
(2)BroadReceiver不能够在10秒内结束接收到任务。例如:下面这个ANR异常就是由于BroadReceiver产生的,其原因是因为CPU占用达到100%出现的,这个时候就要去看下是自己进程的CPU占用率过高,还是别的程序CPU占用率过高。如果是自己的程序,就要看日志,执行了什么操作导致CPU占用率太高。我这里是同时播放很多gif图的时候出现的。
ANR in net.myvst.v2:xg_service_v3
08-16 17:25:22.802 E/ActivityManager( 3705): Reason: Broadcast of Intent { act=android.net.conn.CONNECTIVITY_CHANGE flg=0x10000010 cmp=net.myvst.v2/com.tencent.android.tpush.XGPushReceiver (has extras) }
08-16 17:25:22.802 E/ActivityManager( 3705): Load: 44.05 / 20.02 / 10.34
08-16 17:25:22.802 E/ActivityManager( 3705): CPU usage from 18010ms to 190ms ago:
08-16 17:25:22.802 E/ActivityManager( 3705): 30% 3851/com.vlctech