3、日志系统入门:Android logcat 基础,如何过滤 Camera 相关日志。

做 Camera HAL 调试,第一件事是什么?

不是看代码,不是改参数。是学会看日志。

我见过太多新人,一上来就对着代码发呆,或者盲目改参数。其实很多问题,日志里已经告诉你了。只是你没看懂,或者压根没找到对的日志。

这一章,我们就从最基础的 logcat 开始。别嫌简单,这里面坑不少。

3.1 logcat 是什么?

logcat 是 Android 的日志输出工具。说白了,就是系统里所有进程打印信息的地方。你的 Camera HAL、Framework、App,都在这里说话。

我个人习惯,一开调试就挂着 logcat。就像医生听诊,先听听系统在说什么。

3.2 基本用法

打开终端,输入:

adb logcat

嗯,你会看到海量信息刷屏。这时候别慌,我们得学会过滤。

3.2.1 按标签过滤

Camera 相关的日志,通常有固定的标签。比如:

  • CameraHal - HAL 层日志
  • CameraService - Framework 层
  • Camera2 - Camera2 API 相关
  • CamX - 高通平台常用
  • CHIUSECASE - 高通 CHI 架构

过滤命令:

adb logcat -s CameraHal

这样只显示 CameraHal 标签的日志。清爽多了。

小技巧: 我习惯同时看多个标签。比如:
adb logcat -s CameraHal CameraService
这样 HAL 和 Framework 的日志一起看,方便定位问题在哪一层。

3.2.2 按优先级过滤

日志有优先级:V(详细)、D(调试)、I(信息)、W(警告)、E(错误)、F(致命)。

调试时,我一般只看 W 以上的:

adb logcat -s CameraHal:E

这样只显示 CameraHal 的错误日志。但注意,有时候 D 级别的日志里也有关键信息。我曾经被一个 D 级别的日志坑过,找了半天才发现问题。

3.2.3 组合过滤

更高级的用法,用 grep 组合:

adb logcat | grep -E "CameraHal|Error|Fatal"

这样不管什么标签,只要包含这些关键词,都显示出来。适合你不知道具体标签的时候。

3.3 保存日志

调试时,日志刷屏太快,根本来不及看。我建议先保存到文件:

adb logcat -d > camera_log.txt

-d 参数表示 dump 当前缓冲区内容,然后退出。这样你拿到一个完整的日志文件,慢慢分析。

如果想实时保存:

adb logcat -v threadtime > camera_log.txt

-v threadtime 会显示线程 ID 和时间戳。这个格式我强烈推荐,调试多线程问题时特别有用。

3.4 清空缓冲区

有时候日志太乱,想从头开始:

adb logcat -c

清空后,再执行你的操作,日志就干净了。我每次复现问题前,都会先清一下。

3.5 实战:抓取 Camera 打开失败的日志

假设你遇到 Camera 打不开的问题。我会这样做:

  1. 清空日志:adb logcat -c
  2. 开始抓取:adb logcat -v threadtime -s CameraHal:E CameraService:E > fail_log.txt
  3. 复现问题:打开 Camera App
  4. 停止抓取:Ctrl+C
  5. 分析日志:打开 fail_log.txt

你看,三步就拿到关键日志了。很多问题,看一眼 Error 日志就知道原因。比如权限没给、设备节点打不开、buffer 分配失败等等。

注意: 有些平台(比如高通)的 Camera HAL 日志标签可能不一样。我遇到过 CamXCHIUSECASE 两个标签混着用。建议先 adb logcat | grep -i camera 扫一遍,看看实际用了哪些标签。

3.6 常用过滤组合总结

场景 命令
只看 Camera HAL 错误 adb logcat -s CameraHal:E
看 HAL 和 Service 日志 adb logcat -s CameraHal CameraService
关键词模糊搜索 adb logcat | grep -i "camera\|error\|fail"
保存带时间的日志 adb logcat -v threadtime -d > log.txt
实时保存到文件 adb logcat -v threadtime > log.txt

3.7 避坑指南

我曾经犯过一个低级错误:抓了半天日志,发现全是空的。后来才想起来,手机没连上 adb。嗯,先 adb devices 确认一下。

还有一次,我过滤了 CameraHal:E,结果问题出在 CameraService 的 W 级别日志里。所以,别太依赖过滤,有时候全量日志里反而能找到线索。

另外,有些日志是动态打印的。比如第一次打开 Camera 时才会打印初始化信息。如果你清空日志后再操作,就能抓到完整的启动流程。这个习惯我一直保持。

3.8 小结

logcat 是调试 Camera 的第一步。学会过滤,你就能从海量信息中快速定位问题。别小看这个基础技能,我见过很多资深工程师,日志过滤用得比新手还乱。

下一章,我们会深入 Camera HAL 的日志格式,看看每一行日志到底在说什么。到时候你会发现,日志里藏着很多秘密。