快速定位Android闪退问题的方法

写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.tvhome: 23% user + 6.9% kernel / faults: 11118 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   13% 3705/system_server: 11% user + 1.8% kernel / faults: 1450 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   5.7% 4567/com.ktcp.video:push: 4.2% user + 1.5% kernel / faults: 3578 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   3.9% 4662/net.myvst.v2: 3% user + 0.8% kernel / faults: 3531 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   2.5% 74/surfaceflinger: 1.9% user + 0.6% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   1.7% 85/adbd: 0.1% user + 1.6% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   1.2% 4392/com.togic.livevideo: 1.2% user + 0% kernel / faults: 64 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   1.2% 4642/com.moretv.android: 1.1% user + 0% kernel / faults: 672 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.4% 3677/mediaserver: 0.3% user + 0.1% kernel / faults: 343 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.7% 2277/logcat: 0.1% user + 0.6% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.7% 4327/com.dianshijia.newlive: 0.1% user + 0.6% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.6% 4677/net.myvst.v2: 0% user + 0.6% kernel / faults: 389 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0% 73/debuggerd: 0% user + 0% kernel / faults: 4 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 5/events/0: 0% user + 0.2% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 3825/com.amlogic.inputmethod.remote: 0.1% user + 0.1% kernel / faults: 41 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 62/yaffs-bg-1: 0% user + 0.2% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 3682/zygote: 0% user + 0.1% kernel / faults: 330 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 3954/com.wukongtv.wkhelper: 0.2% user + 0% kernel / faults: 48 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.2% 4054/com.kehwin: 0.2% user + 0% kernel / faults: 66 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.1% 59/mali/0: 0% user + 0.1% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.1% 3678/netd: 0.1% user + 0% kernel / faults: 153 minor
08-16 17:25:22.802 E/ActivityManager( 3705):   0.1% 10/sync_supers: 0% user + 0.1% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):   0.1% 50/kthread_di: 0% user + 0.1% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4701/chmod: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4707/com.dangbeimarket: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4729/com.dangbeimarket:bdservice_v1: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4751/com.dangbeimarket:dangbei_web: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4760/com.dangbeimarket:MonitorService: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4769/com.dangbeimarket:appuninstallMonitor: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4830/com.vlctech.upgradeservice: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4854/net.myvst.v2:xg_service_v3: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4884/net.myvst.v2:xg_service_v3: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4915/cat: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705):  +0% 4916/cat: 0% user + 0% kernel
08-16 17:25:22.802 E/ActivityManager( 3705): 100% TOTAL: 76% user + 22% kernel + 0.4% irq + 0.3% softirq
  • OOM:当应用占用的内存超过了系统可以给应用分配的最大内存时,就会出现OOM。通常在decode Bitmap对象、在xml文件中inflate大的背景图片、内存泄露时,应用很容易就会出现OOM。
    例如:下面这个OOM就是在decode图片时出现的。解决这种异常可以采用更小的采样率或者直接更换小的图片。
08-17 20:35:38.311 D/dalvikvm( 5665): GC_BEFORE_OOM freed <1K, 17% free 54496K/65351K, paused 293ms, total 293ms
08-17 20:35:38.311 E/dalvikvm-heap( 5665): Out of memory on a 3686416-byte allocation.
08-17 20:35:38.311 I/dalvikvm( 5665): "main" prio=5 tid=1 RUNNABLE
08-17 20:35:38.311 I/dalvikvm( 5665):   | group="main" sCount=0 dsCount=0 obj=0x40d6f6a0 self=0x400460b0
08-17 20:35:38.311 I/dalvikvm( 5665):   | sysTid=5665 nice=0 sched=0/0 cgrp=apps handle=1074503472
08-17 20:35:38.311 I/dalvikvm( 5665):   | schedstat=( 0 0 0 ) utm=19045 stm=3308 core=1
08-17 20:35:38.311 I/dalvikvm( 5665):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
08-17 20:35:38.311 I/dalvikvm( 5665):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:500)
08-17 20:35:38.311 I/dalvikvm( 5665):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:353)
08-17 20:35:38.311 I/dalvikvm( 5665):   at android.graphics.BitmapFactory.decodeResource(BitmapFactory.java:376)

你可能感兴趣的:(Android知识整理)