在 Android 开发中使用 logcat 的基础知识

Posted

技术标签:

【中文标题】在 Android 开发中使用 logcat 的基础知识【英文标题】:Basics on using logcat in Android development 【发布时间】:2013-08-13 04:58:50 【问题描述】:

我刚开始使用 android,我不明白如何使用这个 logcat 东西。

我正在开发模拟器,但将来可能也会在真实设备上工作。正在测试的程序之一 (SEE HERE) 在启动时挂断,其他用户建议我查看 logcat。但是我计算机中的 logcat 不断显示新文本并向上滚动。我不知道如何在所有这些混乱中寻找任何东西。有时,当我什至没有测试我的程序时,它会一直滚动。

如果我在模拟器中做任何事情,它会显示吗?模拟器已经很慢了,以至于很难弄清楚模拟器上的哪个事件导致了哪个消息。

另外,对于初学者来说,logcat 的详细程度是多少?断言不会显示任何内容(这可能是合乎逻辑的,因为我没有启用断言),所以我认为 Error 可能是最不冗长的模式,但即便如此,日志也有太多消息需要处理。

我需要将其设置为的最低详细级别是多少,是否有任何示例程序可以让我测试代码中的哪种事件在 logcat 中产生哪种 if 消息? (我在 IDE 中使用 logcat)

--- 编辑---

我看到logcat有这样的消息

08-12 08:24:26.699: I/Choreographer(528): Skipped 57 frames!  The application may be doing too much work on its main thread.  
08-12 08:25:02.550: I/Choreographer(528): Skipped 33 frames!  The application may be doing too much work on its main thread.  
08-12 08:25:07.950: I/Choreographer(528): Skipped 37 frames!  The application may be doing too much work on its main thread.  
08-12 08:25:08.022: E/SoundPool(287): error loading /system/media/audio/ui/Effect_Tick.ogg  
08-12 08:25:08.022: W/Audioservice(287): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg  
08-12 08:25:08.022: E/SoundPool(287): error loading /system/media/audio/ui/Effect_Tick.ogg  
08-12 08:25:08.022: W/AudioService(287): Soundpool could not load file: /system/media/audio/ui/Effect_Tick.ogg  

这是信息模式,详细模式有更多难以理解的文字,所以我没有包含它。看起来它找不到包含按下后退按钮时要播放的声音效果的文件,它显示在日志上。如何删除与手机操作系统用户界面相关的此类不必要的消息,并仅显示与我正在测试的程序相关的消息以及导致它在代码中调用 onCreate() 之前挂断的原因?我现在希望能够从 IDE 执行此操作。

【问题讨论】:

【参考方案1】:

Log.v() - 详细

Log.d() - 调试

Log.i() - 信息

Log.w() - 警告

Log.e() - 错误


提示:一个好的约定是在你的类中声明一个 TAG 常量:

private static final String TAG = "MyActivity";

提示:当你打电话时不要忘记这一点

Log.e(TAG, "index=" + i);

使用Log.e();,因为它以红色显示您可以轻松识别所有日志中的错误


您也可以在 eclipse 中使用 flitter Logs 进行检查。

更多详情请查看Developer Site。

【讨论】:

【参考方案2】:

在处理有问题的应用程序时,我会在 logcat 中切换到 ERROR 模式,并为我的应用程序的 package 名称添加过滤器,例如。 com.something.blah。这样我只会看到与我的应用相关的错误消息。

当然,有时这些信息还不够,但当您需要更多信息时,您应该可以轻松地使用 logcat :)

对于手动记录(使用Log.*),非常独特的标签(类似于ThisIsAVeryUniqueTag1234)可以节省大量时间。只需过滤此标签,它应该是您看到的唯一消息。有关如何使用标签和手动记录的完整信息,请参阅 Log。

【讨论】:

【参考方案3】:
adb -d logcat <your package name>:<log level> *:S

-d 表示实际设备,-e 表示仿真器。如果运行的模拟器超过 1 个,您可以使用 -s emulator-&lt;emulator number&gt;(例如,-s emulator-5558

示例:adb -d logcat com.example.example:I *:S

或者,如果您使用System.out.print 将消息发送到日志,您可以使用adb -d logcat System.out:I *:S 仅显示对System.out 的调用。

您可以在此处找到所有日志级别和更多信息:http://developer.android.com/guide/developing/tools/adb.html#logcat

你应该在你的代码中使用Log.&lt;log level&gt;(TAG, message),标签可以是任何东西,但我总是使用包名。

示例: Log.i("com.example.example", "message");

【讨论】:

我知道我可以将我的自定义消息发布到日志 cat 并且由于我使用 IDE 来处理所有内容,因此我可以通过 IDE 上的按钮将其清除。令人困惑的是,即使我没有运行我的程序,它也会继续滚动消息。即使当我按下返回按钮、按下主页按钮等时,它似乎也会显示很多消息。这些类型的消息会引起混乱。 那么是否可以过滤 logcat,以便只显示与我正在测试的程序相关的消息? 是的,这是可能的。我已经编辑了我的答案。请检查。但它适用于控制台。 如果有帮助,请采纳答案,以便其他人快速了解正确答案。谢谢

以上是关于在 Android 开发中使用 logcat 的基础知识的主要内容,如果未能解决你的问题,请参考以下文章

如何使用android中的logcat调试程序

android程序在logcat中不停地打印timeline时间戳

如何把android开发的时候把LogCat里的内容复制出来?如果不能复制,要是转储到文件中请说明详细步骤?

怎样android让log打印更友好

android的日志Logger和Log比较,哪个好?

Android中如何通过logcat追踪生命周期事件?