2、调试环境搭建:ADB工具配置、root权限获取、logcat日志系统、dumpsys命令详解
好,咱们直接进入正题。调试环境搭建,说白了就是你跟手机硬件对话的「翻译官」和「听诊器」。没有这套东西,你写的HAL代码就是个黑盒子,跑起来对不对全靠猜。我刚开始搞相机HAL那会儿,就吃过这个亏——代码编译通过了,但预览画面就是黑的,折腾了两天才发现是ADB权限没给够。嗯,咱们一步步来。
2.1 ADB工具配置:你的第一把螺丝刀
ADB(Android Debug Bridge)是Android调试的基石。它分三部分:PC端的adb客户端、手机端的adbd守护进程、以及中间通信的USB或网络连接。
安装与配置
我个人习惯把ADB放在一个干净的目录,比如 C:\adb 或 /usr/local/adb。然后把这个目录加到系统PATH里。为什么?因为后面你会频繁敲adb命令,每次都要cd到目录太烦了。
# Windows 下添加环境变量(以管理员身份运行cmd)
setx PATH "%PATH%;C:\adb" /M
# Linux / macOS 下
export PATH=$PATH:/usr/local/adb
# 建议写到 ~/.bashrc 或 ~/.zshrc 里永久生效
验证连接
插上手机,打开开发者选项和USB调试。然后敲:
adb devices
如果看到 List of devices attached 下面有一行设备号,恭喜你,通了。如果显示 unauthorized,看看手机屏幕上有没有弹出授权弹窗,点「允许」就行。
adb kill-server 然后 adb start-server 可以重置ADB服务,解决大部分连接异常。
2.2 root权限获取:打开系统的大门
做相机HAL调试,root权限几乎是必须的。为什么?因为很多相机相关的节点(比如 /dev/video*、/sys/class/camera/)默认只有root或system用户能读写。没有root,你连dump一个帧都做不到。
获取root的方法
这里我不展开讲刷机教程,只说几种常见情况:
- 开发板/工程机: 直接刷userdebug或eng版本的系统,自带root。用
adb root即可切换。 - 量产机: 需要解锁bootloader,刷入Magisk或SuperSU。注意,解锁会清空数据,务必提前备份。
- 模拟器: 默认就是root,直接
adb root就行。
验证root是否成功
adb root
adb shell
# 如果看到 $ 变成 #,说明已经是root了
# 或者执行
id
# 输出 uid=0(root) 就对了
adb root 后,发现 setprop 命令仍然报权限错误。后来发现是SELinux在作怪。解决办法是 adb shell setenforce 0 临时关闭SELinux。调试完记得恢复 setenforce 1,否则系统不安全。
2.3 logcat日志系统:你的听诊器
logcat是Android的日志系统。对于相机HAL来说,它是最直接的「听诊器」。你写的每个 ALOGE、ALOGW、ALOGI 都会出现在这里。
基本用法
# 查看所有日志(默认是实时输出)
adb logcat
# 按日志级别过滤:V(详细), D(调试), I(信息), W(警告), E(错误), F(致命)
adb logcat *:E
# 按标签过滤(相机HAL常用标签)
adb logcat -s CameraHal:V
adb logcat -s CameraService:V
adb logcat -s CAM_HAL:V
# 同时过滤多个标签
adb logcat -s CameraHal:V CameraService:V
保存日志到文件
调试时我习惯把日志保存下来,方便回头分析:
adb logcat -d > camera_log.txt
# -d 表示 dump 当前缓冲区内容后退出,不会持续输出
清空缓冲区
有时候日志太多,眼花缭乱。先清空再操作:
adb logcat -c
实战经验: 我在调试高通平台的相机HAL时,发现 mm-camera 相关的日志特别多,而且很多是 D 级别的。这时候我会用 adb logcat -s mm-camera:W 只看警告和错误,减少干扰。等定位到问题后,再调低级别看细节。
2.4 dumpsys命令详解:系统状态的X光机
dumpsys 可以 dump 出系统服务的内部状态。对于相机来说,dumpsys media.camera 是最常用的。
基本用法
# 查看所有可dump的服务
adb shell dumpsys -l
# 查看相机服务状态
adb shell dumpsys media.camera
# 查看特定摄像头的信息(比如后置摄像头ID为0)
adb shell dumpsys media.camera -v 0
输出解读
dumpsys 的输出信息量很大,我挑几个关键字段说说:
| 字段 | 含义 | 调试价值 |
|---|---|---|
Number of cameras |
系统检测到的摄像头数量 | 如果数量不对,说明HAL层上报有问题 |
Camera ID |
摄像头的唯一标识 | 确认你操作的是哪个摄像头 |
Facing |
前置(0)还是后置(1) | 检查方向配置是否正确 |
Orientation |
图像旋转角度 | 预览方向不对时查这个 |
Supported HW Level |
硬件支持级别(LEGACY/LIMITED/FULL/LEVEL_3) | 判断设备能力上限 |
Stream configurations |
支持的输出格式和分辨率 | 确认你的配置是否在支持列表内 |
高级用法:结合grep
dumpsys 输出动辄几百行,手动翻太累。我常用管道过滤:
# 只看摄像头数量
adb shell dumpsys media.camera | grep "Number of cameras"
# 只看后置摄像头的配置
adb shell dumpsys media.camera | grep -A 20 "Camera ID 0"
# 查看当前是否有客户端连接
adb shell dumpsys media.camera | grep "Client"
get_camera_info 里重复注册了同一个摄像头ID。所以,dumpsys 的结果一定要跟硬件规格书对照着看,别盲目相信。
2.5 综合调试流程:一个实际案例
假设你刚写完一个HAL实现,发现预览画面出不来。你会怎么做?我一般按这个顺序排查:
- 检查连接:
adb devices确认设备在线。 - 获取root:
adb root然后adb shell setenforce 0关掉SELinux。 - 清空日志:
adb logcat -c避免旧日志干扰。 - 启动相机App: 手动打开相机,或者用
adb shell am start -a android.media.action.IMAGE_CAPTURE。 - 抓取日志:
adb logcat -d > debug.log保存日志。 - 查看dumpsys:
adb shell dumpsys media.camera | grep -E "Error|Failed|State"快速定位异常。 - 分析日志: 搜索
E/CameraHal、E/mm-camera等关键标签。
这套流程我用了好几年,90%的问题都能在10分钟内定位到根因。剩下的10%,嗯,那就要靠经验和运气了。
总结一下: ADB是手,root是钥匙,logcat是耳朵,dumpsys是眼睛。把这四样工具用好,你的相机HAL调试效率至少提升一倍。下一章我们聊聊如何用这些工具去抓取和分析实际的相机数据流。