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

4

我刚开始学习Android,不太明白如何使用logcat

我正在模拟器上工作,但将来可能会在真实设备上工作。测试一个程序(点击这里)出现了问题,其他用户建议我查看logcat。但是我的电脑上的logcat一直显示新的文本并向上滚动。我不确定如何在所有混乱中寻找任何内容。有时候即使我没有测试程序,它也会继续滚动。

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

对于初学者来说,logcat需要哪个级别的详细程度?转到assert并不会显示任何内容(这很合理,因为我没有启用断言),所以我认为错误可能是最少冗长的模式,但即便如此,日志也有太多的信息需要处理。

我需要设置的最低冗长级别是什么,并且是否有任何样本程序可以让我测试代码中的哪种事件会产生logcat中的哪种消息?(我在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中完成此操作。

3个回答

4

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中使用过滤器日志,请查看以下内容。

enter image description here

enter image description here

有关更多详细信息,请参见开发人员网站


1
adb -d logcat <your package name>:<log level> *:S

-d 表示实际设备,-e 表示模拟器。如果有多个模拟器在运行,你可以使用 -s emulator-<模拟器编号>(例如,-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.<日志级别>(TAG, message),其中标签可以是任何内容,但我总是使用包名。

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


我知道我可以将自定义消息发布到日志记录器中,由于我使用IDE进行所有操作,因此我可以通过IDE上的按钮清除它。令人困惑的是,即使我没有运行程序,它仍然不断滚动消息。似乎它正在显示许多消息,即使我按返回按钮、按主页按钮等。这些类型的消息是导致混淆的原因。 - user13267
那么,是否有可能过滤Logcat,以便仅显示与我正在测试的程序相关的消息? - user13267
是的,这是可能的。我已经编辑了我的答案,请检查。但它只适用于控制台。 - Sushil
如果有帮助的话,请接受答案,这样其他人就可以快速了解正确的答案。谢谢。 - Sushil

1
当我处理一个有问题的应用程序时,我会在logcat中切换到ERROR模式,并添加一个筛选器来过滤我的应用程序的包名,例如com.something.blah。这样,我只能看到与我的应用程序相关的错误消息。
当然,在某些情况下,这些信息是不够的,但是当你需要更多信息时,你应该已经熟悉了使用logcat :)
对于手动记录日志(使用Log.*),一个非常独特的标签(例如ThisIsAVeryUniqueTag1234)可以节省很多时间。只需过滤此标签,它应该是您看到的唯一消息。请参见Log以获取有关如何使用标签和手动记录日志的完整信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接