2. Camera HAL 开发环境搭建:Linux 开发环境配置、Android 源码下载与编译、AOSP 与 HAL 模块编译
Camera HAL 驱动的开发与调试高度依赖一套完整、可复现的编译与运行环境。本章将系统讲解从 Linux 宿主机配置、Android 源码(AOSP)下载与编译,到 HAL 模块独立编译的完整流程,帮助开发者建立标准化的开发工作台。
2.1 Linux 开发环境配置
Android 源码编译与 HAL 开发推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 作为宿主操作系统。以下为关键环境配置项:
| 配置项 | 推荐值 / 版本 | 说明 |
|---|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 LTS (x86_64) | 官方 AOSP 持续集成环境 |
| 磁盘空间 | ≥ 400 GB(SSD 优先) | 单次完整 AOSP 编译约需 150~250 GB |
| 内存 | ≥ 16 GB(推荐 32 GB) | 并行编译时内存消耗大 |
| CPU | ≥ 8 核(推荐 16 核) | 多核加速编译 |
| Python | 3.8 ~ 3.11 | repo 工具依赖 |
| Git | ≥ 2.25 | 版本管理 |
| OpenJDK | 11 或 17(按 AOSP 分支) | Android 12+ 需 JDK 11 |
磁盘空间提示: 建议预留 400 GB 以上 SSD 空间。若仅编译 HAL 模块(不编译完整系统镜像),可缩减至 100 GB 左右,但仍需下载完整源码树。
基础软件包安装命令:
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
2.2 Android 源码下载与版本选择
AOSP 源码通过 Google 的 repo 工具管理。下载流程分为三步:安装 repo、初始化仓库、同步代码。
2.2.1 安装 repo 工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH
2.2.2 初始化与同步
mkdir ~/aosp
cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
repo sync -j$(nproc) -c
网络注意事项: 国内开发者建议使用清华或中科大 AOSP 镜像站。替换
-u 参数为 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest,并设置 git config --global url."https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/".insteadOf https://android.googlesource.com。
2.2.3 分支选择参考
| Android 版本 | 推荐分支 Tag | HAL 接口版本 | 适用场景 |
|---|---|---|---|
| Android 12 | android-12.1.0_r27 | HAL 3.4 / 4.0 | 主流中端平台 |
| Android 13 | android-13.0.0_r41 | HAL 3.4 / 4.0 | 当前推荐开发基线 |
| Android 14 | android-14.0.0_r15 | HAL 4.0 / 4.1 | 新平台适配 |
2.3 AOSP 完整编译流程
完整编译生成系统镜像,用于刷机验证 HAL 功能。以下以 aosp_x86_64-eng 目标为例:
cd ~/aosp
source build/envsetup.sh
lunch aosp_x86_64-eng
make -j$(nproc) 2>&1 | tee build.log
关键编译产物路径:
out/target/product/generic_x86_64/— 系统镜像目录out/host/linux-x86/bin/— 主机工具(如 adb、fastboot)out/soong/— Soong 构建中间文件
编译加速技巧: 使用
ccache 可大幅缩短重复编译时间。在 build/envsetup.sh 后执行 export USE_CCACHE=1 && export CCACHE_DIR=/path/to/ccache && ccache -M 50G。
2.4 HAL 模块独立编译
在实际开发中,频繁编译完整 AOSP 效率低下。Camera HAL 模块支持独立编译,仅编译 HAL 相关代码并替换到已有系统镜像中。
2.4.1 模块编译命令
source build/envsetup.sh
lunch aosp_x86_64-eng
make android.hardware.camera.provider@2.4-impl -j$(nproc)
编译产物位于:out/target/product/generic_x86_64/vendor/lib/hw/ 或 out/target/product/generic_x86_64/vendor/lib64/hw/。
2.4.2 模块替换与验证
# 将编译好的 HAL 模块推送到设备
adb root
adb remount
adb push out/target/product/generic_x86_64/vendor/lib64/hw/camera.vendor.so /vendor/lib64/hw/
adb reboot
# 验证 HAL 是否加载成功
adb logcat -b all | grep -i "camera"
模块编译前提: 确保已至少完成一次完整 AOSP 编译,生成所有依赖的共享库和头文件。否则模块编译会因缺少
libcamera_client.so 等依赖而失败。
2.5 开发环境架构总览
下图展示了 Camera HAL 开发环境的整体架构与数据流:
2.6 常见问题与避坑指南
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
repo sync 中断或报 403 |
网络限制或镜像站不稳定 | 使用国内镜像,添加 --no-tags 参数减少同步量 |
make 报 jack-server 错误 |
Android 8.0 以下使用 Jack 编译器 | 升级到 Android 9+ 或配置 Jack 内存上限 |
HAL 模块编译提示 undefined reference |
缺少依赖库或头文件路径 | 检查 Android.bp 中 shared_libs 和 header_libs 是否完整 |
| 设备刷机后 HAL 未加载 | SELinux 策略阻止或权限不足 | 检查 avc: denied 日志,临时 setenforce 0 验证 |
| 编译速度极慢 | 未启用 ccache 或磁盘 I/O 瓶颈 | 配置 ccache 50G+,使用 SSD,降低 -j 并行数 |
2.7 开发环境验证清单
完成环境搭建后,建议按以下清单逐项确认:
- 源码完整性:
repo status无未同步文件,du -sh ~/aosp大小 ≥ 40 GB - 编译工具链:
which make && make --version输出正常 - JDK 版本:
java -version显示 OpenJDK 11 或 17 - 完整编译:
make -j4至少成功一次,生成system.img - 模块编译:
make android.hardware.camera.provider@2.4-impl无报错 - 设备连接:
adb devices识别目标设备,adb root可提权
推荐工作流: 日常开发使用
make 模块名 独立编译 HAL → adb push 替换 → adb reboot 验证。仅在 HAL 接口变更或需要生成完整镜像时执行全编译。此流程可将单次迭代时间从 30 分钟缩短至 1~2 分钟。