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 打不开的问题。我会这样做:
- 清空日志:
adb logcat -c - 开始抓取:
adb logcat -v threadtime -s CameraHal:E CameraService:E > fail_log.txt - 复现问题:打开 Camera App
- 停止抓取:Ctrl+C
- 分析日志:打开 fail_log.txt
你看,三步就拿到关键日志了。很多问题,看一眼 Error 日志就知道原因。比如权限没给、设备节点打不开、buffer 分配失败等等。
CamX 和 CHIUSECASE 两个标签混着用。建议先 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 的日志格式,看看每一行日志到底在说什么。到时候你会发现,日志里藏着很多秘密。