一,Bug出现了, 需要“干掉”它

bug一听挺吓人的,但是只要你懂了,android里的bug是很好解决的,因为android里提供了LOG机制,具体的底层代码,以后在来分析,只要你会看bug,

android里应用开发也就很简单了。

那我们先来看看android里的ANR,怎么出现ANR呢,很简单。

# adbshell

# cd data/app

# monkey -p com.xxx.xxx -v 3000 (com.xxx.xxx是你应用程序的包名,如果想知道monkey详细用法,执行 monkey help )

实际上很多优秀android应用都会出现ANR,比如UC浏览器,360等等,如果你有兴趣可以回去试试,

这样,ANR出现了。 开始做修改准备工作,得到log文件。

有人问log文件在哪儿?
一般在/data/log下面(但是真机才有的)。你可以通过执行命令adb shell进去看看,用pull把log文件拉到你的电脑里

好,得到log文件了,我们就准备开始工作了 。 我将详细的log文件上传到附件供大家参考。

下载地址为http://download.csdn.net/detail/andy_android/3785393

二,Log的种类

android.util.Log常用的方法有以下六个:Log.v()Log.d()Log.i()Log.w()Log.e()以及Log.a() (android 4.0新增加的)。根据首字母对应 VERBOSEDEBUG,INFO,WARNERROR,Assert。

1、Log.v 的调试颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v("","");

2、Log.d的输出颜色是蓝色的,仅输出debug调试的意思,但他会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择.

3、Log.i的输出为绿色,一般提示性的消息information,它不会输出Log.v和Log.d的信息,但会显示i、w和e的信息

4、Log.w的意思为橙色,可以看作为warning警告,一般需要我们注意优化Android代码,同时选择它后还会输出Log.e的信息。

5、Log.e为红色,可以想到error错误,这里仅显示红色的错误信息,这些错误就需要我们认真的分析,查看栈的信息了。

6 Log.a为4.0新增加的。

启动Eclipse,打开DDMS大家可以在LogCat里看见(前提是android 4.0的ADT)

建议:

Filter Name的值=应用程序中TagName+Filter

by Log Tag:应用程序中设定的tab

by Log level:根据需要选择相应的日志级别

点击 ,将编辑处于活动窗口的Log Filter

点击 ,将清除当前活动窗口中的日志信息


三,如何分析和研究Log文件,如何看日志信息Logandroid中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧。 下面我们就来说说如何处理log文件。

Log分为Fatal和ANR

什么时候会有Log文件的产生?
Log
的产生大家都知道, 大家也都知道通过DDMS来看log(这个就不用说了),但什么时候会产生log文件呢?一般在如下几种情况会产生log文件。
1
,程序异常退出,uncausedexception (Fatal)
2
,程序强制关闭,ForceClosed (简称FC) (Fatal)
3
,程序无响应,ApplicationNo Response(简称ANR)

ANR出现的情况有以下两种

A 界面操作按钮的点击等待响应时间超过5秒

B HandleMessage回调函数执行超过10秒,BroadcasterReciver里的onRecive()方法处理超过10秒

4,手动生成。


拿到一个日志文件,要分成多段来看。log文件很长,其中包含十几个小单元信息,但不要被吓到,事实上他主要由三大块儿组成 。

1
,系统基本信息,包括 内存,CPU,进程队列,虚拟内存 , 垃圾回收等信息 。------MEMORY INFO (/proc/meminfo) ------
------CPU INFO (top -n 1 -d 1 -m 30 -t) ------
------PROCRANK (procrank) ------
------VIRTUAL MEMORY STATS (/proc/vmstat) ------
------VMALLOC INFO (/proc/vmallocinfo) ------

格式如下:
------MEMORY INFO (/proc/meminfo) ------
MemTotal: 347076 kB
MemFree: 56408 kB
Buffers: 7192 kB
Cached: 104064 kB
SwapCached: 0 kB
Active: 192592 kB
Inactive: 40548 kB
Active(anon):129040 kB
Inactive(anon):1104 kB
Active(file): 63552 kB
Inactive(file): 39444 kB
Unevictable: 7112 kB
Mlocked: 0kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 44kB
Writeback: 0 kB
AnonPages: 129028 kB
Mapped: 73728 kB
Shmem: 1148kB
Slab: 13072kB
SReclaimable: 4564 kB
SUnreclaim: 8508 kB
KernelStack: 3472 kB
PageTables: 12172 kB
NFS_Unstable: 0 kB
Bounce: 0kB
WritebackTmp: 0 kB
CommitLimit: 173536 kB
Committed_AS: 7394524 kB
VmallocTotal:319488 kB
VmallocUsed: 90752 kB
VmallocChunk:181252 kB


2
,事件信息, 也是我们主要分析的信息 。
------VMALLOC INFO (/proc/vmallocinfo) ------
------EVENT INFO (/proc/vmallocinfo) ------

格式如下:
------SYSTEM LOG (logcat -b system -v time -d *:v) ------
01-1516:41:43.671 W/PackageManager( 2466): Unknown permissioncom.wsomacp.permission.PROVIDER in package com.android.mms
01-1516:41:43.671 I/ActivityManager( 2466): Force stopping packagecom.android.mms uid=10092
01-1516:41:43.675 I/UsageStats( 2466): Something wrong here, didn't expectcom.sec.android.app.twlauncher to be paused
01-1516:41:44.108 I/ActivityManager( 2466): Start proccom.sec.android.widgetapp.infoalarm for servicecom.sec.android.widgetapp.infoalarm/.engine.DataService: pid=20634uid=10005 gids={3003, 1015, 3002}
01-1516:41:44.175 W/ActivityManager( 2466): Activity pause timeout forHistoryRecord{48589868com.sec.android.app.twlauncher/.Launcher}
01-1516:41:50.864 I/KeyInputQueue( 2466): Input event
01-1516:41:50.866 D/KeyInputQueue( 2466): screenCaptureKeyFlag setting0
01-1516:41:50.882 I/PowerManagerService( 2466): Ulight 0->7|0
01-1516:41:50.882 I/PowerManagerService( 2466): Setting target 2: cur=0.0target=70 delta=4.6666665 nominalCurrentValue=0
01-1516:41:50.882 I/PowerManagerService( 2466): Scheduling lightanimator!
01-1516:41:51.706 D/PowerManagerService( 2466): enableLightSensortrue
01-1516:41:51.929 I/KeyInputQueue( 2466): Input event
01-1516:41:51.933 W/WindowManager( 2466): No focus window, dropping:KeyEvent{action=0 code=26 repeat=0 meta=0 scancode=26mFlags=9}



3
,虚拟机信息, 包括进程的,线程的跟踪信息,这是用来跟踪进程和线程具体点的好地方。
------VM TRACES JUST NOW (/data/anr/traces.txt.bugreport: 2011-01-1516:49:02) ------
------VM TRACES AT LAST ANR (/data/anr/traces.txt: 2011-01-15 16:49:02)------


格式如下:
-----pid 21161 at 2011-01-15 16:49:01 -----
Cmdline: com.android.mms

DALVIKTHREADS:
"main"prio=5 tid=1 NATIVE
|group="main" sCount=1 dsCount=0 s=N bj=0x4001d8d0self=0xccc8
|sysTid=21161 nice=0 sched=0/0 cgrp=default handle=-1345017808
|schedstat=( 4151552996 5342265329 10995 )
atandroid.media.MediaPlayer._reset(Native Method)
atandroid.media.MediaPlayer.reset(MediaPlayer.java:1218)
atandroid.widget.VideoView.release(VideoView.java:499)
atandroid.widget.VideoView.access$2100(VideoView.java:50)
atandroid.widget.VideoView$6.surfaceDestroyed(VideoView.java:489)
atandroid.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:572)
atandroid.view.SurfaceView.updateWindow(SurfaceView.java:476)
atandroid.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:206)
atandroid.view.View.dispatchDetachedFromWindow(View.java:6082)
atandroid.view.ViewGroup.dispatchDetachedFromWindow(ViewGroup.java:1156)
atandroid.view.ViewGroup.removeAllViewsInLayout(ViewGroup.java:2296)
atandroid.view.ViewGroup.removeAllViews(ViewGroup.java:2254)
atcom.android.mms.ui.SlideView.reset(SlideView.java:687)
atcom.android.mms.ui.SlideshowPresenter.presentSlide(SlideshowPresenter.java:189)
atcom.android.mms.ui.SlideshowPresenter$3.run(SlideshowPresenter.java:531)
atandroid.os.Handler.handleCallback(Handler.java:587)
atandroid.os.Handler.dispatchMessage(Handler.java:92)
atandroid.os.Looper.loop(Looper.java:123)
atandroid.app.ActivityThread.main(ActivityThread.java:4627)
atjava.lang.reflect.Method.invokeNative(Native Method)
atjava.lang.reflect.Method.invoke(Method.java:521)
atcom.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
atcom.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
atdalvik.system.NativeStart.main(NativeMethod)

---------------------------------------------------------------------------------------------------------------------------------------
闲话少说,我总结了观察log文件的基本步骤。1,如果是ANR问题, 则搜索“ANR”关键词。 快速定位到关键事件信息 。
2
,如果是ForceClosed和其它异常退出信息,则搜索"Fatal"关键词,快速定位到关键事件信息 。
3
,定位到关键事件信息后, 如果信息不够明确的,再去搜索应用程序包的虚拟机信息,查看具体的进程和线程跟踪的日志,来定位到代码。

用这种方法,出现问题,根本不需要断点调试, 直接定位到问题,屡试不爽 。
下面,我们就开始来分析这个例子的log

打开log文件, 由于是ANR错误,因此搜索"ANR",为何要加空格呢,你加上和去掉比较一下就知道了 。可以屏蔽掉不少保存到anr.log文件的无效信息。

定位到关键的事件信息如下:
01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
01-1516:49:02.433 E/ActivityManager( 2466): Reason:keyDispatchingTimedOut
01-1516:49:02.433 E/ActivityManager( 2466): Load: 0.6 / 0.61 / 0.42
01-1516:49:02.433 E/ActivityManager( 2466): CPU usage from 1337225ms to57ms ago:
01-1516:49:02.433 E/ActivityManager( 2466): sensorserver_ya:8% = 0% user + 8% kernel / faults: 40 minor
......


01-1516:49:02.433 E/ActivityManager( 2466):-com.android.mms:0% = 0% user + 0% kernel
01-1516:49:02.433 E/ActivityManager( 2466):-flush-179:8: 0% =0% user + 0% kernel
01-1516:49:02.433 E/ActivityManager( 2466): TOTAL: 25% = 10% user + 14%kernel + 0% iowait + 0% irq + 0% softirq
01-1516:49:02.436 I/ ( 2466):dumpmesg >"/data/log/dumpstate_app_anr.log"


我们用自然语言来描述一下日志,这也算是一种能力吧。
01-1516:49:02.433 E/ActivityManager( 2466): ANR in com.android.mms(com.android.mms/.ui.SlideshowActivity)
翻译:在16:492433毫秒的时候ActivityManager

更多相关文章

  1. android:gravity 和 android:layout_Gravity属性——android开发
  2. 在Android(安卓)Studio中使用cmake编译FFmpeg
  3. android调用隐藏的网络信息设置菜单实现
  4. Android(安卓)Building System 总结 收藏
  5. [转]Android(安卓)NDK学习笔记
  6. eclipse下android的sdk配置问题
  7. android Service之四:传递复杂数据类型的远程服务
  8. Android(安卓)文件格式
  9. Android(安卓)Studio3.0新特性及安装图文教程

随机推荐

  1. zoomable android textview
  2. android 屏保锁中屏掉按键和HOME键的方法
  3. Android 保存图片到图库
  4. Android TableLayout的使用
  5. Android UI 开发入门—线性布局
  6. android处理单击双击和滑动事件
  7. Android Studio 闪退卡死的问题
  8. android 加载图片并在上面画图
  9. SeekBar的使用
  10. Android事件处理(6)