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 文件。
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 配置步骤
- 设置 Android 编译环境
cd ~/camx_workspace
source build/envsetup.sh
lunch <target>-userdebug # 例如:lunch qssi-userdebug
- 验证 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
- 确认 Ninja 可用
prebuilts/ninja/linux-x86/ninja --version
# 预期输出:1.11.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 版本匹配。
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 并重启。
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 秒内完成迭代。