当前位置: 代码迷 >> Android >> 第一章 工欲善其事 必先利其器—Android SDK工具(六)
  详细解决方案

第一章 工欲善其事 必先利其器—Android SDK工具(六)

热度:77   发布时间:2016-04-28 03:09:36.0
第一章 工欲善其事 必先利其器—Android SDK工具(6)

1.6 Log打印—Log输出工具(logcat)

1.6.1 启动logcat

不仅仅是Android开发,对于所有的软件开发来说,Log的地位都是非常重要的,它是一位我们在开发和调试过程当中不可避免都会接触到的朋友,因此,怎么和这位朋友搞好关系,是我们必须要掌握好的。

在Android当中,Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用。

我们可以使用adb logcat命令来运行logcat:

图1-32 运行logcat

 

1.6.2 过滤日志输出

在开发和调试中,我们经常需要打印Log出来进行查看。但是有时候在大量的日志中寻找我们需要的信息是一件很头疼的事情,这里就需要我们在日志的海洋中过滤出我们需要的信息。

每一个输出的Android日志信息都有一个标签和它的优先级。

日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就是查看系统的标签)。

按照从低到高顺序来排列,优先级有以下几种:

V — Verbose (lowest priority)

D — Debug

I — Info

W — Warning

E — Error

F — Fatal

S — Silent (highest priority, on whichnothing is ever printed)

在运行logcat的时候在前两列的信息中你就可以看到logcat的标签列表和优先级别,它是这样标出的:<priority>/<tag> ,如图1-33所示。

图1-33 logcat的组成

 

在这里我们可以看到,它的优先级是D,标签是dalvikvm。

为了让日志输出能体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级。

过滤器语句按照下面的格式描tag:priority … , tag 表示是标签,priority 是表示标签的报告的最低等级。 从上面的tag的中可以得到日志的优先级。你可以在过滤器中多次写tag:priority,它们之间用空格来表示。

下面的过滤语句指显示优先级为Info或更高的日志信息:
adb logcat *:I

效果如图1-34所示。

图1-34 logcat过滤

 

这样之前优先级为D的log信息就被过滤了,只显示I等级以上的log信息。

1.6.3 控制日志输出格式

日志信息包括了许多元数据域。我们可以修改日志的输出格式,以显示出特定的元数据域。

Logcat提供了以下几种格式:

1) brief-默认格式,log是按“优先级/标签 (原进程的PID)”的格式来显示的;

2) process-log是按“优先级 (原进程的PID)”的格式来显示的;

3) tag-log是按“优先级/标签”的格式来显示的;

4) thread-log是按“优先级 (进程号:线程号)”的格式来显示的;

5) raw-显示原始的log信息,不再有其他的元数据域;

6) time-log是按“时间优先级/标签”的格式来显示的;

7) long-显示所有的元数据域,并且信息之间以空白行来间隔。

当启动了logcat ,我们可以通过-v 选项来指定输出格式:

[adb] logcat [-v <format>]

下面是用 thread 来产生的日志格式:
adb logcat -v thread

效果图如图1-35所示。

图1-35 控制logcat输出格式

 

1.6.4 查看可用日志缓冲区

Android日志系统有循环缓冲区,并不是所有的日志系统都有默认循环缓冲区。为了得到日志信息,你需要通过-b选项来启动logcat。如果要使用循环缓冲区,你需要查看剩余的循环缓冲区:

radio — 查看缓冲区的相关的信息。

events — 查看和事件相关的的缓冲区。

main — 查看主要的日志缓冲区

-b 选项使用方法:

[adb] logcat [-b <buffer>]

下面的例子表示怎么查看日志缓冲区包含radio 和 telephony信息:

adb logcat -b radio

效果图如图1-36所示。

图1-36 查看缓冲区

 

经验分享:

Android中由系统启动的进程,默认STDOUT和STDERR(System.out和System.err )是被定向到/dev/null中去的,所以,从adb shell是看不到程序的输出的,只能通过LOGW等打印,然后通过logcat查看。

  相关解决方案