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,带宽影响等待时间 |
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设备的通信路径:
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
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问题。