3. 开发环境搭建:Ubuntu下AOSP源码下载、Camera HAL模块编译、模拟器与真机调试环境配置

搭建一个稳定、可复现的开发环境是进行CameraProvider调试的基础。本章将指导你在Ubuntu系统下完成AOSP源码的完整下载、Camera HAL模块的独立编译,以及模拟器与真机两种调试环境的配置。整个过程遵循AOSP官方规范,并针对Camera HAL开发者的常见痛点进行优化。

3.1 硬件与软件环境要求

在开始之前,请确保你的开发机满足以下最低配置要求。配置不足将导致编译时间过长或系统卡顿。

项目 最低要求 推荐配置 说明
CPU 4核 x86_64 8核或以上 编译AOSP是CPU密集型任务,多核可显著加速
内存 16 GB 32 GB 或 64 GB 内存不足会导致OOM或swap频繁,编译速度骤降
磁盘 250 GB 空闲 500 GB SSD AOSP源码+编译产物约150~300GB,SSD可提升I/O
操作系统 Ubuntu 20.04 LTS Ubuntu 22.04 LTS 官方推荐Ubuntu LTS版本,工具链兼容性最好
网络 10 Mbps 100 Mbps 首次下载源码约30~60GB,带宽影响等待时间
提示: 强烈建议使用 Ubuntu 22.04 LTS 并搭配 ext4 文件系统。不要使用NTFS或FAT32挂载的磁盘进行编译,因为符号链接和权限问题会导致大量错误。

3.2 AOSP源码下载与分支选择

AOSP源码管理基于 repo 工具。Camera HAL的代码结构在不同Android版本间有较大差异,尤其是Treble架构引入后。以下是针对CameraProvider开发的分支选择建议。

3.2.1 安装Repo与配置Git

# 1. 安装基础依赖
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \
    libncurses5-dev x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils \
    xsltproc unzip fontconfig python3

# 2. 安装Repo工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 3. 配置Git身份(必须,否则repo同步会报错)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

3.2.2 初始化与同步指定分支

对于Camera HAL开发,推荐使用 android-14.0.0_r30 或更新的分支,因为它们对HAL接口的抽象更完善。

# 创建工作目录(注意磁盘空间)
mkdir -p ~/aosp/android-14
cd ~/aosp/android-14

# 初始化指定分支(以android-14.0.0_r30为例)
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r30

# 同步源码(-j4 根据CPU核心数调整,首次同步建议不加-j避免网络中断)
repo sync -c -j4 --no-tags
注意: 同步过程可能持续数小时。如果网络不稳定,可以分多次执行 repo sync。同步完成后,务必检查 repo status 确认所有项目均为绿色(clean)状态。

3.2.3 Camera HAL相关代码路径

同步完成后,CameraProvider的核心代码位于以下路径,你需要熟悉它们:

  • hardware/interfaces/camera/ —— Camera HIDL / AIDL 接口定义
  • hardware/google/camera/ —— Google参考实现(含CameraProvider)
  • hardware/qcom/camera/ —— Qualcomm平台Camera HAL实现
  • frameworks/av/camera/ —— Camera框架层(CameraService)
  • system/libvintf/ —— VINTF兼容性矩阵,用于声明HAL实现

3.3 Camera HAL模块独立编译

全量编译AOSP耗时过长。对于Camera HAL开发,我们采用 模块化编译 策略,只编译CameraProvider及其依赖的共享库。

3.3.1 设置编译环境

# 进入源码根目录
cd ~/aosp/android-14

# 加载编译环境变量
source build/envsetup.sh

# 选择编译目标(以aosp_cf_x86_64_phone-userdebug为例,用于模拟器)
lunch aosp_cf_x86_64_phone-userdebug
关键概念: lunch 命令选择 target 和 variant。对于Camera调试,userdebug 变体提供root权限和更少的权限限制,是首选。

3.3.2 编译CameraProvider模块

使用 mma 或 make 命令编译指定模块。以下命令编译Google参考CameraProvider:

# 方法一:mma(推荐,自动分析依赖)
cd hardware/google/camera/
mma -j$(nproc)

# 方法二:make(从根目录指定模块名)
cd ~/aosp/android-14
make -j$(nproc) android.hardware.camera.provider@2.7-service-google

编译成功后,输出文件位于 out/target/product/<device>/vendor/bin/hw/ 目录下,例如:

out/target/product/cf_x86_64_phone/vendor/bin/hw/android.hardware.camera.provider@2.7-service-google

3.3.3 编译产物验证

使用 file 命令检查编译产物是否为正确的ELF可执行文件:

file out/target/product/cf_x86_64_phone/vendor/bin/hw/android.hardware.camera.provider@2.7-service-google
# 输出示例:ELF 64-bit LSB executable, x86-64, dynamically linked, not stripped
调试技巧: 如果编译时遇到头文件找不到的错误,通常是因为缺少 libcamera_client 或 libgui 等依赖库。可以先执行 make -j$(nproc) libcamera_client 编译依赖,再编译CameraProvider。

3.4 模拟器调试环境配置

模拟器是Camera HAL开发初期最便捷的调试环境。AOSP提供了 Cuttlefish 虚拟设备,它支持完整的Camera HAL栈。

3.4.1 启动Cuttlefish模拟器

# 编译Cuttlefish镜像(首次需要)
source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
make -j$(nproc) dist

# 启动模拟器
launch_cvd --daemon

# 检查模拟器状态
adb devices
# 应显示:127.0.0.1:6520  device

3.4.2 推送自定义CameraProvider到模拟器

将编译好的CameraProvider二进制文件推送到模拟器,替换默认实现:

# 重新挂载vendor分区为可写
adb root
adb remount

# 推送新的CameraProvider
adb push out/target/product/cf_x86_64_phone/vendor/bin/hw/android.hardware.camera.provider@2.7-service-google \
    /vendor/bin/hw/

# 重启Camera HAL服务
adb shell pkill -f android.hardware.camera.provider

# 验证服务是否重启成功
adb shell dumpsys media.camera

3.4.3 模拟器Camera HAL架构图

下图展示了Cuttlefish模拟器中CameraProvider与底层虚拟Camera设备的通信路径:

Cuttlefish模拟器Camera HAL架构 Cuttlefish模拟器 Camera HAL 通信架构 CameraService CameraProvider HAL Virtual Front Camera Virtual Back Camera Virtual External Camera Kernel V4L2 / Goldfish Camera Driver 说明:CameraProvider通过HIDL/AIDL接口与CameraService通信,底层通过V4L2驱动访问虚拟Camera设备

3.5 真机调试环境配置

真机调试能暴露模拟器无法复现的硬件相关bug。以下以Pixel 6/7系列为例,配置真机调试环境。

3.5.1 解锁Bootloader与刷入AOSP镜像

# 1. 进入fastboot模式(关机后按住音量下+电源键)
adb reboot bootloader

# 2. 解锁bootloader(会清除所有数据)
fastboot flashing unlock

# 3. 编译AOSP镜像(选择对应设备)
source build/envsetup.sh
lunch aosp_oriole-userdebug  # Pixel 6
make -j$(nproc)

# 4. 刷入镜像
fastboot flashall -w
警告: 解锁bootloader会触发设备的安全熔断,某些功能(如Google Pay、银行应用)可能永久失效。建议使用专用开发机。

3.5.2 真机CameraProvider替换与调试

真机上的CameraProvider通常由SoC厂商(如Qualcomm)提供。替换为自定义版本前,需要禁用SELinux或将其设置为宽容模式:

# 设置SELinux为宽容模式(仅调试用)
adb root
adb shell setenforce 0

# 备份原始CameraProvider
adb shell cp /vendor/bin/hw/android.hardware.camera.provider@2.7-service-qcom \
    /vendor/bin/hw/android.hardware.camera.provider@2.7-service-qcom.backup

# 推送自定义Provider
adb push out/target/product/oriole/vendor/bin/hw/android.hardware.camera.provider@2.7-service-google \
    /vendor/bin/hw/android.hardware.camera.provider@2.7-service-qcom

# 重启HAL服务
adb shell pkill -f android.hardware.camera.provider

# 查看logcat日志
adb logcat -c
adb logcat | grep -E "CameraProvider|CameraService|HAL"

3.5.3 真机与模拟器调试对比

对比维度 模拟器(Cuttlefish) 真机(Pixel 6/7)
启动速度 快(秒级) 慢(分钟级,需刷机)
硬件依赖 无,使用虚拟Camera 依赖真实ISP、传感器、闪光灯
调试权限 默认root,无限制 需解锁bootloader,SELinux限制
性能分析 无法反映真实帧率/延迟 可测量真实Camera pipeline性能
适用阶段 接口调试、逻辑验证 性能调优、硬件兼容性测试

3.6 常见环境问题与解决方案

以下是搭建环境过程中最常遇到的三个问题及其快速排查方法:

  • 问题1:repo sync失败,提示“fatal: unable to access”
    原因:网络被墙或代理配置错误。
    解决:设置Git代理 git config --global http.proxy http://127.0.0.1:1080,或使用国内镜像源(如清华AOSP镜像)。
  • 问题2:编译时出现“No rule to make target”
    原因:缺少依赖模块或未执行 lunch。
    解决:确认已执行 source build/envsetup.sh && lunch,然后 make -j$(nproc) missing_dependency 先编译依赖。
  • 问题3:模拟器启动后Camera HAL服务crash
    原因:VINTF清单不匹配或SELinux策略拒绝。
    解决:检查 adb logcat | grep avc 查看SELinux denial,临时执行 adb shell setenforce 0 确认是否SELinux问题。
最佳实践: 建议在 模拟器 上完成CameraProvider的接口适配和基本功能验证,再迁移到 真机 上进行性能调优和硬件兼容性测试。这样可以大幅缩短每次调试的迭代周期。