Logcat — 是 Android SDK 的工具,用于实时查看系统消息和应用程序日志,可通过 ADB 或 Android Studio 的内置控制台访问。根据 Android Developers,Logcat 收集所有系统进程的消息,按重要级别和标签进行过滤,让开发者能够诊断错误、跟踪代码执行和分析性能。Logcat — 是调试 Android 应用程序时的主要信息来源。
要点
Logcat — 是 Android 的系统缓冲区,所有进程(包括 Linux 内核、system_server 和应用程序)都以特定格式写入消息。作为 Android SDK 一部分的 logcat 工具读取此缓冲区并实时显示消息。从 Android 4.1(API 16)开始,对 Logcat 的访问受到限制:应用程序只能读取自己的日志,而系统日志可通过 ADB 的调试访问获取。
每个 Logcat 消息包含五个字段:日期和时间、PID(进程标识符)、TID(线程标识符)、日志级别和标签。格式是固定的,对所有 Android 版本都相同。这使得可以在 CI/CD 管道中使用 grep、awk 和 sed 工具过滤日志,而无需依赖 IDE。
日志存储在固定大小的循环缓冲区中:main 为 256 KB,system 为 256 KB,events 为 256 KB(Android 5+)。缓冲区溢出时,旧消息将被删除。开发者可以通过 PROP logcat.size 或在设备的开发者设置中更改缓冲区大小。
六个级别的日志记录决定了消息的重要性。Android 使用与其他平台类似的标准级别,但在 Log 类中有自己的常量名称。选择正确的级别有助于有效过滤日志,避免关键消息被次要消息淹没。
| 级别 | 常量 | 用途 | 默认显示 |
|---|---|---|---|
| VERBOSE | Log.v | 最详细的调试信息 | 否 |
| DEBUG | Log.d | 给开发者的调试消息 | 否 |
| INFO | Log.i | 关于应用程序运行的信息消息 | 是 |
| WARN | Log.w | 关于潜在问题的警告 | 是 |
| ERROR | Log.e | 严重错误和异常 | 是 |
| ASSERT | Log.wtf | 原则上不应该发生的错误 | 是 |
标签 (tag) — 最多 23 个字符的字符串,用于标识消息来源。建议使用类名或模块名作为标签:MainActivity、AuthManager、NetworkModule。这样可以按应用程序的特定组件过滤日志。为了团队的一致性,可以在单独的文件中创建标签常量,或使用 Timber 库,它会根据类名自动设置标签。
当发生 未处理的异常时,Android 会自动在 Logcat 中写入完整的堆栈跟踪,包括类、方法、代码行和调用链。崩溃日志包含异常类型(NullPointerException、RuntimeException)、消息以及从崩溃点到应用程序入口点的调用顺序。要分析来自用户设备的崩溃日志,可使用 Firebase Crashlytics,它会将堆栈跟踪与混淆映射(Android 的 mapping.txt)同步。
Android Studio 提供了 Logcat 的图形界面,可通过 View → Tool Windows → Logcat(Alt + 6)访问。Logcat 窗口实时更新,显示已连接设备的所有消息,并允许配置灵活的过滤器以从整体流中提取所需信息。
下拉列表 Log Level 按最低级别过滤消息:选择 WARN 可仅查看警告和错误,隐藏 VERBOSE、DEBUG 和 INFO。搜索字段允许按消息文本或标签搜索 — 支持正则表达式,便于按模式搜索消息。
Saved Filters — Android Studio 中 Logcat 的强大功能。您可以创建一个过滤器,仅显示带有应用程序标签(tag:MyApp)和 WARN+ 级别的消息。过滤器在会话之间保存,并可从下拉列表中访问。对于多模块项目,请为每个模块创建单独的过滤器。
# 用于过滤应用程序日志的示例表达式
tag:"MyApp" level:WARN # 仅 MyApp 的 WARN+
package:"com.mycompany" # 包的所有日志
-tag:"okhttp" # 排除 OkHttp 日志
Logcat 日志可通过 Save to File 图标导出到文本文件。这对于附加到 Jira 工单或分析长时间会话非常有用。导出的日志可以在任何文本编辑器中打开,并应用 grep 搜索模式。对于格式化查看,可使用 logcat-color 工具。
ADB logcat — Logcat 的控制台版本,通过 Android Debug Bridge 访问。其主要优点是可以运行在 CI 服务器、自动化脚本以及没有 Android Studio 的设备上。ADB logcat 支持与 GUI 相同的所有过滤器,但具有命令行的灵活性。
adb logcat 命令不带参数时会实时显示整个缓冲区。使用 Ctrl+C 停止。-c 标志在开始记录前清除缓冲区 — 当需要将当前测试的日志与之前的消息隔离时非常方便。-b 标志选择缓冲区类型:main、system、events、crash(Android 12+)。
# 清除缓冲区并使用标签 MyApp 开始记录日志
adb logcat -c
adb logcat MyApp:D *:S
# 将日志保存到文件
adb logcat -d > logcat_dump.txt
# 按进程的 PID 过滤
adb logcat --pid=12345
ADB 与 Unix 工具的组合提供了最大的灵活性。例如,过滤器 "*:S TAG:D" 仅显示带有标签 TAG 且级别为 DEBUG 及以上的消息,隐藏所有其他消息。要仅查看 Exception,使用 grep -i exception。要分析错误频率,在标签列上应用 sort | uniq -c。
在 CI 服务器上,Logcat 用于在运行 UI 测试时收集诊断信息。典型的管道:在测试开始前清空缓冲区,测试执行后将日志转储保存为构建产物。如果测试失败,可根据日志确定失败是由 ANR、未处理的异常还是网络超时引起的。
android.util.Log 类 — 用于向 Logcat 写入消息的内置 API。Log.v、Log.d、Log.i、Log.w、Log.e 和 Log.wtf 接受标签(字符串)和消息(字符串)或消息 + Throwable。要格式化消息,请使用 String.format 或 Kotlin String templates — 避免字符串拼接,这会在堆中创建额外的对象。
Timber — Jake Wharton 的流行库,消除了内置 Log API 的缺点。Timber 根据调用日志记录的类名自动设置标签,并且不需要在每次调用时传递标签。Timber 还支持条件日志记录:在 Release 构建中,可以通过 Application.onCreate 中的一行代码禁用 Timber.v 和 Timber.d 调用。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 内置日志 API
Log.d("MainActivity", "onCreate called")
// Timber — 基于类名的自动标签
Timber.d("onCreate called")
}
private fun loadData() {
try {
val result = fetchFromNetwork()
Timber.i("Data loaded: $result")
} catch (e: IOException) {
Timber.e(e, "Failed to load data")
}
}
}
在 Release 构建中,建议禁用 VERBOSE 和 DEBUG 日志,以减少 Logcat 缓冲区的负载并防止敏感信息泄漏。Timber 通过 PlantingTree 解决此问题:在 Debug 变体中植入 DebugTree(记录所有内容),在 Release 中植入 CrashReportingTree(仅通过 Crashlytics 记录 ERROR)。内置 Log API 不支持条件日志记录 — 开发者必须将每次调用包装在 if (BuildConfig.DEBUG) 中。
常见问题
使用 命令 adb logcat -c 在运行测试前清除缓冲区。或者,在 Android Studio 中点击 Logcat 窗口中的 Clear Logcat 按钮(垃圾桶)。清除操作不会影响其他进程的系统缓冲区,仅影响当前连接。
执行 adb logcat -G 2M 将缓冲区增加到 2 MB。最大大小取决于设备:在 Android 10+ 上最高可达 16 MB。更改会保留到设备重启。对于永久配置,请在 device tree 中使用 build.prop。
可能的原因:应用程序在 Release 模式下运行(Timber.v/d 日志已禁用),Logcat 过滤器隐藏了所需的级别,或者您连接到了错误的设备。同时检查 Android Studio 中是否选择了应用程序进程,而不是 system_process。
找到包含 FATAL EXCEPTION 的行,其下方是完整的堆栈跟踪。第一行包含异常类型和消息,后续行是调用链,包含文件和代码行号。使用 grep "FATAL EXCEPTION" 在所有日志中快速搜索。
ANR(Application Not Responding) — 主线程(UI 线程)被阻塞超过 5 秒的情况。在 Logcat 中,ANR 显示为带有标签 ActivityManager 和文本 "ANR in ..." 以及所有线程的堆栈跟踪的消息。使用过滤器 tag:ActivityManager level:ERROR。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。