2. 开发环境搭建:Linux开发环境配置、AOSP源码下载与编译、Camera HAL模块编译与烧录
构建稳定的Camera HAL系统,首先需要搭建一套完整、可复现的开发环境。本章将引导你完成从Linux基础环境配置、AOSP源码管理、到Camera HAL模块独立编译与烧录的全流程。这是后续所有实战项目的基础设施,请务必按步骤逐一验证。
2.1 Linux开发环境配置
推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 作为宿主操作系统。AOSP的编译系统对内存和磁盘有较高要求,建议配置如下:
| 资源项 | 最低要求 | 推荐配置 | 说明 |
|---|---|---|---|
| CPU | 4核 | 8核或以上 | 编译时间与核心数成反比 |
| 内存 | 16 GB | 32 GB | 低于16GB可能导致OOM |
| 磁盘 | 250 GB | 500 GB SSD | AOSP源码+编译产物约150-200GB |
| 操作系统 | Ubuntu 20.04 | Ubuntu 22.04 | 需64位系统 |
2.1.1 基础依赖包安装
AOSP编译需要大量工具链和库支持。执行以下命令安装核心依赖:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
gcc --version 和 python3 --version 确认工具链版本。AOSP 14要求Python 3.8+,GCC 10+。
2.1.2 Repo工具与Git配置
Repo是Google为管理多Git仓库的AOSP项目提供的工具。安装与配置步骤如下:
- 安装Repo:
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
- 配置Git身份:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
- 配置Git缓存(可选,加速后续操作):
git config --global credential.helper cache
--manifest-url 指定镜像地址。
2.2 AOSP源码下载与编译
本节以 Android 14 (UpsideDownCake) 分支为例,演示从源码下载到完整编译的完整流程。Camera HAL模块依赖AOSP的框架层和硬件抽象层接口,因此必须拥有完整的编译环境。
2.2.1 源码下载流程
下图展示了AOSP源码下载的完整工作流:
执行以下命令完成源码下载:
mkdir ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15
repo sync -j8 -c
2.2.2 编译环境初始化与全编译
源码同步完成后,需要加载编译环境并选择目标设备。以 Pixel 6 (raven) 为例:
source build/envsetup.sh
lunch aosp_raven-userdebug
lunch 命令会设置以下关键环境变量:
| 环境变量 | 示例值 | 作用 |
|---|---|---|
| TARGET_PRODUCT | aosp_raven | 指定目标设备 |
| TARGET_BUILD_VARIANT | userdebug | 编译类型(user/userdebug/eng) |
| ANDROID_HOST_OUT | out/host/linux-x86 | 主机工具输出路径 |
| ANDROID_PRODUCT_OUT | out/target/product/raven | 目标镜像输出路径 |
执行全编译(首次编译约2-4小时):
make -j$(nproc)
ccache 可以显著加速重复编译。在 ~/.bashrc 中添加:export USE_CCACHE=1export CCACHE_DIR=~/.ccacheccache -M 50G # 设置缓存上限为50GB
2.3 Camera HAL模块编译与烧录
在全编译验证通过后,我们进入Camera HAL模块的独立编译与烧录环节。Camera HAL通常位于 hardware/google/camera 或 vendor/<oem>/camera 目录下。独立编译可以大幅缩短开发迭代周期。
2.3.1 Camera HAL模块结构
下图展示了Camera HAL模块在AOSP中的位置及其内部组件关系:
2.3.2 独立编译Camera HAL模块
使用 mmm 或 make 指定模块名进行独立编译。推荐使用 make 方式,因为它会自动处理依赖关系:
# 方式一:使用mmm(需先source envsetup.sh)
mmm hardware/google/camera/
# 方式二:使用make + 模块名(推荐)
make camera.raven -j$(nproc)
编译成功后,输出文件位于:
out/target/product/raven/vendor/lib64/hw/camera.raven.so
out/target/product/raven/vendor/lib64/hw/android.hardware.camera.provider@2.6-impl-*.so
2.3.3 烧录与验证
将编译好的HAL模块烧录到设备中,有两种常用方式:
| 方式 | 命令 | 适用场景 | 速度 |
|---|---|---|---|
| adb push | adb push camera.raven.so /vendor/lib64/hw/ |
快速迭代调试 | 快(秒级) |
| make flash | make flash -j$(nproc) |
完整系统更新 | 慢(分钟级) |
adb push 方式详细步骤:
- 重启设备到可写状态:
adb root
adb remount
- 推送HAL模块:
adb push out/target/product/raven/vendor/lib64/hw/camera.raven.so /vendor/lib64/hw/
adb push out/target/product/raven/vendor/lib64/hw/android.hardware.camera.provider@2.6-impl-*.so /vendor/lib64/hw/
- 重启CameraService:
adb shell pkill -f cameraserver
# 或重启整个设备
adb reboot
- 验证HAL是否加载成功:
adb shell dmesg | grep -i camera
adb shell lsof | grep camera.raven
- 确保设备已解锁bootloader,并处于
userdebug或eng编译类型。 - 使用
adb remount前,需确认设备已adb root且分区可写。 - 如果
/vendor分区空间不足,可先删除旧so文件:adb shell rm /vendor/lib64/hw/camera.*.so
2.4 常见问题与排查
以下是环境搭建和编译过程中最常遇到的几个问题及解决方案:
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
repo sync 中断 |
网络不稳定或Git对象损坏 | 执行 repo sync --force-sync 强制重新同步 |
make 报错 No rule to make target |
缺少依赖模块或分支不匹配 | 检查 Android.bp 中的依赖声明,确保所有依赖模块已同步 |
| 烧录后相机应用闪退 | HAL接口版本不匹配或权限问题 | 检查 logcat 中 CameraService 的异常堆栈,确认HAL实现符合HAL3规范 |
adb remount 失败 |
设备未解锁或分区只读 | 执行 adb disable-verity 并重启,再尝试 adb remount |
- 为AOSP源码目录创建符号链接到SSD,加速文件访问。
- 使用
m命令(make的别名)配合-j参数,充分利用多核CPU。 - 每次修改HAL代码后,只编译模块并adb push,避免全编译。