做应用开发大部分时候都基础的logcat日志,其实android系统本身提供的不仅有logcat日志,还有events、kernel日志。

Android 底层有几个“log buffer”(缓冲区):

  • main:普通应用/系统日志(默认)
  • system:系统组件日志
  • events:事件日志(EventLog)
  • radio:通信相关
  • 还有 crash 等(新版本)
Buffer 参数 内容
main -b main 普通应用日志(Log.d/i/e 等)
system -b system 系统服务相关日志
events -b events EventLog 事件(二进制事件转文本)
radio -b radio 电话/基带相关
crash -b crash 崩溃日志
kernel -b kernel 内核日志(部分版本)

logcat 本质是从这些 buffer 里读数据的一个工具。
命令如下:

logcat            # 默认从 main + system + crash 等读取
logcat -b main    # 只看 main buffer
logcat -b events  # 只看 events buffer

一、抓取main.log日志

adb logcat -b main -v time > main.log

示例:
main.log截图示例
通过main.log日志就能分析日常应用的问题,或者framework层的问题。

二、抓取events日志的方法:

adb logcat -b events -v time > events.txt

示例:
events.log示例
通过events.log 事件日志,能分析页面的启动,各种生命周期,应用进程的启动、kill过程等,平时分析anr、进程无故退出、等锁等问题需要用到events日志的。

2.1 查看发生anr前后日志

关键字:am_anr 找到这个关键字的日志行,然后分析发生前后的组件生命周期状态就能初步定位anr发生的原因了
在这里插入图片描述
如果是no focus window、input disptach timeout等类型的ANR,则可以进一步查看关键字:input_focus,分析焦点的传递情况,看阻塞在哪一个步骤了

am_pss: 能看到进程占用的pss内存值
wm_/am_: wm_开头的能看到Activity生命周期的执行情况,也是很关键得分析信息

举例:
在这里插入图片描述

events tag 对应生命周期阶段 打印时机 是否代表生命周期执行完成
wm_create_task 创建 Task WMS 创建 Task 对象后立即记录 ❌ 不是 Activity 创建完成
wm_task_created 创建 Task Task 创建完成后记录 ✅ Task 已创建
wm_task_to_front Task 前台切换 Task 被移动到前台时记录 ❌ Activity 未必 resume
wm_task_moved Task 顺序变化 Task 在栈中移动时记录
wm_create_activity Activity 创建阶段 创建 ActivityRecord 后记录,还没进入 Activity.onCreate ❌ onCreate 未执行
am_create_activity AMS启动Activity AMS 创建启动请求时记录 ❌ onCreate 未执行
am_proc_start 进程启动 AMS 请求启动新进程时记录(fork前后) ❌ Application未创建
am_proc_bound 进程绑定 新进程 attach 到 AMS,Application绑定完成后记录 ✅ 进程已可运行
wm_restart_activity Activity真正启动 ATMS 调用 realStartActivity,准备发送生命周期事务 ❌ onCreate未开始
wm_set_resumed_activity 设置当前resume Activity AMS/WMS设置 mResumedActivity 后记录 ❌ onResume未完成
wm_on_create_called Activity.onCreate() 进入 onCreate 调用时记录 ❌ onCreate还没返回
wm_on_start_called Activity.onStart() 进入 onStart 调用时记录 ❌ onStart还没返回
wm_on_resume_called Activity.onResume() 进入 onResume 调用时记录 ❌ onResume还没返回
wm_on_top_resumed_gained Top Resume onResume之后,系统确认该Activity成为top resumed时记录 ✅ onResume阶段已完成一部分
wm_on_top_resumed_lost_called Top Resume丢失 Activity失去top resumed状态时记录 ❌ onPause未完成
wm_pause_activity Pause开始 AMS通知旧Activity进入pause时记录 ❌ onPause未开始/刚准备开始
wm_on_paused_called Activity.onPause() 进入onPause调用时记录 ❌ onPause未返回
wm_add_to_stopping Stop准备 Activity进入stopping列表时记录 ❌ onStop未执行
wm_stop_activity Stop开始 AMS通知Activity stop时记录 ❌ onStop未执行
wm_on_stop_called Activity.onStop() 进入onStop调用时记录 ❌ onStop未返回
wm_activity_launch_time 首次启动完成 Activity启动流程结束、认为已显示时记录 ✅ 包含首帧显示完成
2.2 查看等锁日志

关键字:adb logcat -b events | grep dvm_lock_sample
在这里插入图片描述
不同位置日志信息含义:在这里插入图片描述

2.3 查看低内存:am_low_memory、am_mem_factor、am_meminfo

在这里插入图片描述

三、抓取kernel日志的方法:

# 实时显示内核打印信息并保存到android_kmsg.log文件中
adb shell cat /proc/kmsg |tee android_kmsg.log

示例:
在这里插入图片描述在这里插入图片描述
kernel日志,可以跟踪开机过程一些关键阶段,或者类似于比较底层的低内存查杀日志,比如:lowmemorykiller过程等。

例如:开机过程因为LMK机制导致系统应用被kill,导致冷启动劣化,会在内核的日志中搜索到lowmemorykiller关键字的日志

<6>[Fri May 22 14:40:26 2026] [   47.712539] lowmemorykiller: Killing 'com.test.myapp' (3991) (tgid 3991), adj 0,\x0a   to free 125180kB on behalf of 'RenderThread' (4753) because\x0a   cache 12004kB is below limit 32768kB for oom_score_adj 0\x0a   defrag_free 876kB\x0a   Free memory is -32060kB above reserved
<6>[Fri May 22 14:40:26 2026] [   47.712548] lowmemorykiller:    Free cma:74476kB, file cma:146444kB
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐