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 开发环境的整体架构与数据流:

Camera HAL 开发环境架构 宿主机(Ubuntu 20.04 / 22.04) AOSP 源码树 ~/aosp/ 编译工具链 Soong / Make / Clang 调试工具 adb / logcat / gdb 目标设备(Android 模拟器 / 开发板 / 手机) Camera HAL 模块 camera.vendor.so Camera Service cameraserver Kernel 驱动 V4L2 / CSI adb push / fastboot flash

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 开发环境验证清单

完成环境搭建后,建议按以下清单逐项确认:

  1. 源码完整性: repo status 无未同步文件,du -sh ~/aosp 大小 ≥ 40 GB
  2. 编译工具链: which make && make --version 输出正常
  3. JDK 版本: java -version 显示 OpenJDK 11 或 17
  4. 完整编译: make -j4 至少成功一次,生成 system.img
  5. 模块编译: make android.hardware.camera.provider@2.4-impl 无报错
  6. 设备连接: adb devices 识别目标设备,adb root 可提权
推荐工作流: 日常开发使用 make 模块名 独立编译 HAL → adb push 替换 → adb reboot 验证。仅在 HAL 接口变更或需要生成完整镜像时执行全编译。此流程可将单次迭代时间从 30 分钟缩短至 1~2 分钟。