4. 开发环境搭建:高通CamX源码获取、编译环境配置与ADB调试准备

CamX HAL 开发的第一步是搭建一套完整、可复现的编译与调试环境。本章将引导你完成从源码获取、工具链配置到目标设备连接的全流程,确保后续章节的代码修改与验证能够顺畅进行。

环境概览:CamX 开发依赖高通 LLVM/Clang 工具链、Ninja 构建系统以及 Android 源码树。推荐使用 Ubuntu 20.04/22.04 LTS 作为宿主系统,磁盘剩余空间至少 300GB,内存 16GB 以上。

4.1 高通CamX源码获取

CamX 源码通常作为 Qualcomm 专有包集成在 Android 厂商源码树中,获取方式分为以下两种场景:

场景 源码位置 获取方式
芯片厂商参考包 vendor/qcom/proprietary/camx/ 签署 NDA 后从 Qualcomm 发布门户下载
OEM 项目源码 vendor/oem/camera/ 或 hardware/qcom/camera/ 从 OEM 内部 Git 仓库同步
AOSP + CAF 基线 codeaurora.org 对应 tag repo init -u <CAF manifest> 后 repo sync

以 CAF (Code Aurora Forum) 基线为例,获取 CamX 源码的标准步骤:

# 1. 创建工作目录
mkdir ~/camx_workspace && cd ~/camx_workspace

# 2. 初始化 repo(以 SM8550 平台为例)
repo init -u https://source.codeaurora.org/quic/la/platform/manifest \
          -b release -m LA.VENDOR.1.0.1.r1.xml

# 3. 同步全部源码(耗时较长)
repo sync -j$(nproc) --no-tags

# 4. 确认 CamX 目录存在
ls vendor/qcom/proprietary/camx/
# 预期输出:core/ hwl/ oemlib/ tools/ build/ ...
注意:CamX 源码依赖多个 proprietary 仓库,repo sync 后若缺少 vendor/qcom/proprietary/camx/,请检查 manifest 是否包含 camx 条目,或联系平台负责人获取正确的 XML 文件。
CamX 源码获取流程 CAF Manifest 仓库 repo init + sync 完整源码树 vendor/qcom/camx/ vendor/qcom/chip/ kernel/drivers/ 提示:CamX 核心代码位于 vendor/qcom/proprietary/camx/core/,HWL 层在 hwl/ 子目录 OEM 定制层通常位于 vendor/qcom/proprietary/camx/oemlib/

4.2 编译环境配置:LLVM、Clang 与 Ninja

CamX 强制使用高通预编译的 LLVM/Clang 工具链,而非 GCC。Ninja 作为构建系统,提供比 Make 更快的增量编译能力。

4.2.1 工具链版本要求

组件 推荐版本 来源
LLVM/Clang clang-r450784d (Android 13+) prebuilts/clang/host/linux-x86/
Ninja 1.11.1 prebuilts/ninja/linux-x86/
Python 3.8+ 系统包管理器
Make 4.2.1 系统包管理器

4.2.2 配置步骤

  1. 设置 Android 编译环境
cd ~/camx_workspace
source build/envsetup.sh
lunch <target>-userdebug   # 例如:lunch qssi-userdebug
  1. 验证 Clang 工具链
# 检查预编译 Clang 是否存在
ls prebuilts/clang/host/linux-x86/clang-r450784d/bin/
# 应包含 clang, clang++, llvm-ar, ld.lld 等

# 查看版本
prebuilts/clang/host/linux-x86/clang-r450784d/bin/clang --version
# 输出示例:Android (7019983, based on r450784d) clang version 14.0.6
  1. 确认 Ninja 可用
prebuilts/ninja/linux-x86/ninja --version
# 预期输出:1.11.1
  1. 编译 CamX 模块(验证环境)
# 仅编译 CamX 相关模块,验证工具链链路
make -j$(nproc) camx
# 或使用 Ninja 直接构建
prebuilts/ninja/linux-x86/ninja -C out/combined-<target>.ninja camx
关键检查点:编译日志中应出现 clang++ 调用,而非 g++。若出现 "unknown target triple" 错误,请确认 lunch 选择的 target 与 Clang 版本匹配。
CamX 编译工具链架构 CamX 源码 (.cpp/.h) LLVM/Clang 前端 lld 链接器 Ninja 构建调度 camx.so / camxhal.so

4.3 目标设备与ADB调试环境准备

CamX 开发需要一台已解锁 bootloader 的高通平台设备(如 QRD、MTP、或 OEM 量产机),并通过 ADB 进行调试与日志捕获。

4.3.1 设备要求

项目 要求 说明
SoC 平台 SM8450 / SM8550 / SM8650 等 CamX 架构仅支持高通 7 系及以上
系统版本 Android 13+ CamX 3.x 要求 Android T 以上
Bootloader 已解锁 解锁命令:fastboot oem unlock
ADB 版本 1.0.41+ 支持 adb root 和 adb remount

4.3.2 ADB 环境配置

# 1. 安装 ADB(如未安装)
sudo apt install adb fastboot

# 2. 添加 udev 规则(Linux 下设备权限)
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"' | \
  sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules

# 3. 连接设备并验证
adb devices
# 输出示例:
# List of devices attached
# 1234567890abcdef    device

# 4. 获取 root 权限并 remount 系统分区
adb root
adb remount
# 注意:remount 需要 userdebug 或 eng 版本固件

4.3.3 验证 CamX HAL 是否运行

# 检查 CamX HAL 进程
adb shell ps -A | grep camera
# 预期输出:cameraserver 或 android.hardware.camera.provider

# 检查 CamX 库是否加载
adb shell lsof | grep camx
# 应看到 camx.so 或 libcamxhal.so 被 cameraserver 打开

# 抓取 CamX 日志
adb logcat -c
adb logcat -s CamX
# 打开相机 App 后,应看到 CamX 标签的日志输出
常见问题:若 adb remount 失败,提示 "remount of the super block failed",请确认设备已解锁且系统为 userdebug 版本。部分设备需要先执行 adb disable-verity 并重启。
ADB 调试链路与 CamX 交互 开发主机 (Ubuntu) adb / fastboot USB 目标设备 (QRD/MTP) cameraserver camx.so / hwl 调试流程:编译 → adb push camx.so → adb shell pkill cameraserver → 重新打开相机验证

4.4 环境验证清单

完成上述步骤后,建议逐项确认以下检查点,确保环境就绪:

检查项 验证命令 预期结果
CamX 源码存在 ls vendor/qcom/proprietary/camx/core/ 显示 camxhal.cpp、camxhal3.cpp 等
Clang 可用 clang --version 显示 Android Clang 14+
Ninja 可用 ninja --version 1.11.x
ADB 连接 adb devices 设备状态为 device
Root 权限 adb root 返回 restarting adbd as root
CamX 编译 make camx 2>&1 | tail -20 无 error,生成 camx.so
推荐工作流:每次修改 CamX 源码后,执行 make camx -j$(nproc) 编译,然后 adb push out/target/product/<device>/vendor/lib64/camx.so /vendor/lib64/ 推送至设备,最后 adb shell pkill cameraserver 重启 HAL 进程。整个过程可在 30 秒内完成迭代。