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 为例)

  1. 安装 repo 工具:mkdir ~/bin && curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo && chmod a+x ~/bin/repo
  2. 创建工作目录:mkdir ~/aosp-14 && cd ~/aosp-14
  3. 初始化 AOSP 仓库:repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15
  4. 同步源码:repo sync -j8 -c --no-tags(首次同步约 60–120 分钟,视网络而定)
  5. 拉取 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 环境验证与常见问题

搭建完成后,执行以下验证步骤确保环境可用:

  1. 验证 adb 连接:adb devices 显示设备 serial 且状态为 device
  2. 验证 root 权限:adb root 返回 restarting adbd as root
  3. 验证 HAL 服务运行:adb shell ps -A | grep camera 输出包含 android.hardware.camera.provider
  4. 验证日志输出: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 模块之间的数据流和工具链关系:

Camera HAL 开发环境架构图 Camera HAL 开发环境架构 开发机(Host) AOSP 源码 Vendor 源码 编译系统(make) 编译产物(.so / bin) adb 工具 日志分析工具 日志抓取脚本(capture_camera_logs.sh) USB / 网络 目标设备(Target) Camera HAL 服务 Camera 驱动 logcat 日志缓冲区 dmesg 内核日志 dumpsys media.camera perfetto 追踪 Camera 应用(测试入口) 数据流方向:开发机编译 → adb push/pull → 目标设备运行 → 日志回传至开发机分析

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 识别。