2. Camera HAL 开发环境搭建
Camera HAL 开发与调试依赖一套完整的环境链:从 AOSP 源码下载、HAL 模块编译,到 adb 调试与日志抓取。本章按实际工作流逐步搭建,确保后续章节的排查操作有可靠的环境基础。
2.1 AOSP 源码下载与分支选择
AOSP(Android Open Source Project)是 Camera HAL 开发的根基。下载前需明确目标 Android 版本对应的分支 tag,以及硬件平台(Qualcomm / MediaTek / Exynos)的 vendor 源码获取方式。
| Android 版本 | 推荐 AOSP Tag | 对应 HAL 版本 | 常见芯片平台 |
|---|---|---|---|
| Android 13 (T) | android-13.0.0_r41 | HAL3 + HIDL | SM8450 / MT6983 |
| Android 14 (U) | android-14.0.0_r15 | HAL3 + AIDL | SM8550 / MT6985 |
| Android 15 (V) | android-15.0.0_r10 | HAL3 + AIDL v2 | SM8750 / MT6990 |
经验提示: 下载 vendor 源码前,确认与芯片厂商签订的 NDA 已生效。Qualcomm 的 CAF(Code Aurora Forum)仓库需要单独 repo init,MediaTek 的源码通常通过内部 GitLab 分发。
下载步骤(以 Android 14 为例)
- 安装 repo 工具:
mkdir ~/bin && curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo - 创建工作目录:
mkdir ~/aosp-14 && cd ~/aosp-14 - 初始化 AOSP 仓库:
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15 - 同步源码:
repo sync -j8 -c --no-tags(首次同步约 60–120 分钟,视网络而定) - 拉取 vendor 源码:根据芯片平台执行对应脚本,例如 Qualcomm 平台执行
source vendor/qcom/scripts/setup.sh
常见问题: repo sync 中断后使用
repo sync --force-sync 恢复;磁盘空间至少预留 120 GB(AOSP 源码约 60 GB + vendor 约 30 GB + 编译产物约 30 GB)。
2.2 HAL 模块编译流程
Camera HAL 模块位于 hardware/interfaces/camera 或 vendor/chipset/proprietary/camera。编译方式分为整包编译和单模块编译,调试阶段优先使用单模块编译以节省时间。
核心编译命令:
# 设置编译环境
source build/envsetup.sh
# 选择目标设备(以 Pixel 7 为例)
lunch aosp_bluejay-userdebug
# 单模块编译 Camera HAL(HIDL 版本)
make android.hardware.camera.provider@2.7-service
# 单模块编译 Camera HAL(AIDL 版本)
make android.hardware.camera.provider-service
# 编译产物路径
# out/target/product/bluejay/vendor/bin/hw/android.hardware.camera.provider@2.7-service
编译产物清单
| 模块名称 | 产物路径(相对 out/target/product/<device>) | 说明 |
|---|---|---|
| camera.provider HAL | vendor/bin/hw/android.hardware.camera.provider@2.7-service | 主 HAL 服务进程 |
| camera.device HAL | vendor/lib/hw/camera.<chipset>.so | 设备厂商实现的动态库 |
| camera.metadata | vendor/etc/camera/camera_metadata.xml | 静态 metadata 配置 |
| camera.profiler | vendor/bin/hw/camera.profiler@1.0-service | 性能分析服务(可选) |
2.3 adb 调试环境配置
adb(Android Debug Bridge)是连接开发机与目标设备的核心工具。配置要点包括 USB 权限、多设备管理和 root 权限获取。
环境配置清单
- USB 规则:在
/etc/udev/rules.d/51-android.rules中添加设备 VID/PID,例如SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666",然后执行sudo udevadm control --reload-rules - adb 版本:使用 SDK 内置 adb(
~/Android/Sdk/platform-tools/adb),版本 ≥ 1.0.41 - 多设备管理:
adb -s <serial> shell指定设备;adb devices -l查看所有设备 - root 权限:userdebug 或 eng 版本执行
adb root;若设备已解锁但无法 root,检查ro.debuggable是否为 1
调试技巧: 使用
adb shell setprop persist.vendor.camera.privapp.list com.android.camera2 可临时授予 Camera HAL 调试权限,避免 SELinux 拒绝日志。
2.4 日志抓取工具准备
Camera HAL 问题排查依赖多维度日志:内核日志(dmesg)、HAL 服务日志(logcat)、帧数据流(dump)和性能计数器。以下工具必须提前安装并验证可用性。
日志工具对比
| 工具 | 命令示例 | 适用场景 | 输出文件 |
|---|---|---|---|
| logcat | adb logcat -b all > logcat.txt |
HAL 服务崩溃、metadata 错误 | logcat.txt |
| dmesg | adb shell dmesg > dmesg.log |
驱动异常、DMA 错误、IRQ 超时 | dmesg.log |
| systrace | python systrace.py -t 10 -o trace.html |
帧率抖动、Pipeline 延迟分析 | trace.html |
| perfetto | adb shell perfetto -c /data/misc/perfetto/config.pbtx -o /data/misc/perfetto/trace.perfetto-trace |
精细化的 HAL 函数耗时追踪 | trace.perfetto-trace |
| Camera dump | adb shell dumpsys media.camera > camera_dump.txt |
HAL 状态、Stream 配置、Session 信息 | camera_dump.txt |
日志抓取自动化脚本
#!/bin/bash
# capture_camera_logs.sh — 一键抓取 Camera HAL 全量日志
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_DIR="./camera_logs_${TIMESTAMP}"
mkdir -p ${LOG_DIR}
echo "=== 开始抓取 Camera HAL 日志 ==="
# 1. 清空旧日志
adb logcat -c
adb shell dmesg -c
# 2. 启动 Camera 应用(可选)
adb shell am start -n com.android.camera2/com.android.camera.CameraActivity
# 3. 等待 10 秒后抓取
sleep 10
# 4. 抓取 logcat(过滤 Camera 相关 tag)
adb logcat -d -b main -b system -b crash | grep -E "(Camera|HAL|cam|mm-camera)" > ${LOG_DIR}/logcat_camera.txt
# 5. 抓取 dmesg
adb shell dmesg > ${LOG_DIR}/dmesg.log
# 6. 抓取 dumpsys
adb shell dumpsys media.camera > ${LOG_DIR}/camera_dump.txt
# 7. 抓取 HAL 进程状态
adb shell ps -A | grep camera > ${LOG_DIR}/camera_processes.txt
echo "=== 日志已保存至 ${LOG_DIR} ==="
2.5 环境验证与常见问题
搭建完成后,执行以下验证步骤确保环境可用:
- 验证 adb 连接:
adb devices显示设备 serial 且状态为device - 验证 root 权限:
adb root返回restarting adbd as root - 验证 HAL 服务运行:
adb shell ps -A | grep camera输出包含android.hardware.camera.provider - 验证日志输出:
adb logcat -s CameraHal在打开 Camera 应用时有日志输出
常见失败原因:
- adb devices 显示 unauthorized:设备端未授权 USB 调试,重新插拔并确认 RSA 指纹
- adb root 返回 adbd cannot run as root in production builds:当前镜像为 user 版本,需刷入 userdebug 或 eng 版本
- HAL 服务未启动:检查 SELinux 策略
adb shell getenforce,若为 Enforcing 则查看avc: denied日志 - logcat 无 Camera 日志:确认
persist.vendor.camera.logs属性已设置为1或2
2.6 开发环境架构总览
下图展示了开发机、目标设备与 Camera HAL 模块之间的数据流和工具链关系:
2.7 环境搭建检查清单
完成本章所有步骤后,使用下表逐项确认:
| 检查项 | 验证方法 | 通过标准 |
|---|---|---|
| AOSP 源码完整性 | repo status |
无 missing 或 broken 仓库 |
| HAL 模块编译 | make android.hardware.camera.provider@2.7-service |
编译成功,无 error |
| adb 连接 | adb devices |
显示设备 serial,状态 device |
| root 权限 | adb root && adb shell id |
uid=0(root) |
| 日志抓取 | 执行 capture_camera_logs.sh | 生成 4 个以上日志文件 |
| HAL 服务运行 | adb shell ps -A | grep camera |
至少 1 个 camera 进程 |
环境搭建完成后,即可进入第 3 章:Camera HAL 日志分类与关键 TAG 识别。