Android应用开发中总是少不了Log的辅助,调试环境下Logcat很好地展现了各种事件,很容易就能得到想要的信息;
另外,自己在程序中加入的Thread.UncaughtExceptionHandler能更加全面地抓到一些Crash的log,大大提升了调试定位速度。
但是,如果一个应用已经发布,并没有打开调试选项时怎么办?也就是说,某些情况下是看不到Log的,比如,用DDMS连上Android手机,你会发现并不是所有的应用都是可见的;再举个例子,在使用的过程中,突然出现了一个Crash,但是Log又没有打开,这时该怎样进行检查?
基本上,有两个途径是值得花时间去检查一下的:
1、/data/system/dropbox 下的Log文件,通常来说,Monkey跑出来的Crash会在这里生成文件;检查的时候比对一下事件发生的时间和Log文件生成的时间,基本上就能找到相对应的Crash Log了;提一句:文件名 ***_wtf@1395365681030.txt,其中的“wtf”指“what a terrible failure”,字面意思;
2、/data/log 下的dumpstate_app_anr/error/native.txt.gz文件,顾名思义,记录了应用的anr/error/native的问题,基本上JAVA端发生Crash时,会在error log中有记录的,将此文件用gzip解压之后就可以进行检查了,比如下面这段Log:
03-24 12:12:48.555 2941 3157 I am_resume_activity: [0,1144726280,5,com.example.test/SetActivity]
03-24 12:12:48.565 7741 7741 I am_on_resume_called: [0,com.example.test/SetActivity]
03-24 12:12:48.770 2941 2951 I power_partial_wake_state: [0,ActivityManager-Launch]
03-24 12:12:48.770 2941 2951 I am_destroy_activity: [0,1154407552,5,com.example.test/TestActivity,finish-imm]
03-24 12:12:54.230 2941 3719 I am_finish_activity: [0,1144726280,5,com.example.test/SetActivity,app-request]
03-24 12:12:54.285 2941 3719 I am_pause_activity: [0,1144726280,com.example.test/SetActivity]
03-24 12:12:54.285 2941 3719 I power_partial_wake_state: [1,ActivityManager-Launch]
03-24 12:12:54.290 7741 7741 I am_on_paused_called: [0,com.example.test/SetActivity]
03-24 12:12:54.295 2941 3157 I am_resume_activity: [0,1112892752,5,com.example.test/MainActivity]
03-24 12:12:54.340 7741 7741 I am_on_resume_called: [0,com.example.test/MainActivity]
03-24 12:12:54.460 2941 3719 I power_partial_wake_state: [0,ActivityManager-Launch]
03-24 12:12:54.460 2941 3719 I am_destroy_activity: [0,1144726280,5,com.example.test/SetActivity,finish-imm]
03-24 12:12:55.415 2941 3068 I power_partial_wake_state: [1,AlarmManager]
03-24 12:12:55.420 2941 3023 I power_partial_wake_state: [0,AlarmManager]
03-24 12:12:56.045 2941 3718 I am_crash: [7741,0,com.example.test,11058244,java.lang.IllegalArgumentException,Cannot draw recycled bitmaps,GLES20Canvas.java,789]
03-24 12:12:56.045 2941 3718 I am_finish_activity: [0,1112892752,5,com.example.test/MainActivity,crashed]
03-24 12:12:56.115 2941 3718 I am_pause_activity: [0,1112892752,com.example.test/MainActivity]
03-24 12:12:56.120 2941 3718 I power_partial_wake_state: [1,ActivityManager-Launch]
非常明确地记录了各个Activity的声明周期(am_*** Log),并且确切指出Crash的原因:java.lang.IllegalArgumentException,Cannot draw recycled bitmaps,这样就可以做一个大致的推断,是在SetActivity被销毁后,进入MainActivity时显示了一个被销毁的Bitmap引起的Crash,那么只要聚焦到Bitmap显示的地方进行着重调查就可以了。