在 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-<emulator number>
(例如,-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.<log level>(TAG, message)
,标签可以是任何东西,但我总是使用包名。
示例:
Log.i("com.example.example", "message");
【讨论】:
我知道我可以将我的自定义消息发布到日志 cat 并且由于我使用 IDE 来处理所有内容,因此我可以通过 IDE 上的按钮将其清除。令人困惑的是,即使我没有运行我的程序,它也会继续滚动消息。即使当我按下返回按钮、按下主页按钮等时,它似乎也会显示很多消息。这些类型的消息会引起混乱。 那么是否可以过滤 logcat,以便只显示与我正在测试的程序相关的消息? 是的,这是可能的。我已经编辑了我的答案。请检查。但它适用于控制台。 如果有帮助,请采纳答案,以便其他人快速了解正确答案。谢谢以上是关于在 Android 开发中使用 logcat 的基础知识的主要内容,如果未能解决你的问题,请参考以下文章
android程序在logcat中不停地打印timeline时间戳