2. 开发环境搭建:AOSP源码下载与编译、Camera HAL模块源码位置、交叉编译工具链配置、adb调试环境准备

Camera HAL 开发依赖完整的 Android 开源项目(AOSP)环境。本章将引导你完成从源码获取、编译环境配置到调试工具链搭建的全流程,确保后续 HAL 层开发与调试工作能够顺利开展。

2.1 AOSP 源码下载与编译

AOSP 源码体积庞大(通常 80–120 GB),下载与编译需要稳定的网络环境和充足的磁盘空间。推荐使用 Ubuntu 20.04/22.04 LTS 作为宿主系统。

2.1.1 环境依赖安装

sudo apt-get update
sudo apt-get 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.1.2 下载源码

使用 Google 官方 repo 工具管理多仓库。以下以 Android 13(T)分支为例:

mkdir ~/aosp && cd ~/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
repo sync -j$(nproc)  # 并行同步,耗时约 2–4 小时
网络加速建议: 若访问 google.com 受限,可使用国内镜像源(如中科大、清华 AOSP 镜像),将 repo init 中的 URL 替换为 https://mirrors.ustc.edu.cn/aosp/platform/manifest。

2.1.3 编译 AOSP

编译前需选择目标设备。以 Pixel 6(代号 raven)为例:

source build/envsetup.sh
lunch aosp_raven-userdebug
make -j$(nproc) 2>&1 | tee build.log

编译产物位于 out/target/product/raven/,关键镜像文件如下:

文件 说明
system.img 系统分区镜像,包含 HAL 库
vendor.img 厂商分区镜像,包含 Camera HAL 实现
boot.img 内核与 ramdisk
super.img 动态分区超级镜像(Android 10+)

2.2 Camera HAL 模块源码位置

Camera HAL 源码分散在 AOSP 的 hardware、vendor 和 device 目录中。理解其组织方式有助于快速定位关键文件。

路径 内容
hardware/interfaces/camera/ Camera HAL 接口定义(HIDL / AIDL)
hardware/libhardware/modules/camera/ 参考实现(Camera HAL v1)
vendor/google/ 或 vendor/qcom/ 芯片厂商提供的 Camera HAL 实现
device/google/ 或 device/<oem>/ 设备板级配置与 HAL 适配层
frameworks/av/camera/ CameraService 与 HAL 之间的框架层
开发重点: 实际产品开发中,Camera HAL 实现通常位于 vendor/<chip_vendor>/ 或 device/<oem>/ 下。例如高通平台常见路径为 vendor/qcom/proprietary/camera/。

2.3 交叉编译工具链配置

AOSP 自带基于 Clang/LLVM 的交叉编译工具链,无需额外安装。编译 HAL 模块时,系统自动使用 prebuilts/clang/host/linux-x86/ 下的编译器。

2.3.1 单独编译 Camera HAL 模块

在 AOSP 根目录下,使用 mmm 或 mm 命令编译指定模块:

source build/envsetup.sh
lunch aosp_raven-userdebug
mmm hardware/interfaces/camera/   # 编译 Camera HIDL 接口
mmm vendor/qcom/proprietary/camera/  # 编译厂商 HAL 实现

编译产物输出到 out/target/product/raven/vendor/lib64/ 或 out/target/product/raven/system/lib64/,主要 HAL 库文件包括:

  • camera.<device>.so — Camera HAL 实现库
  • android.hardware.camera.provider@2.7-impl.so — Camera Provider 实现
  • libcameraservice.so — CameraService 框架库

2.3.2 手动配置 NDK 交叉编译(可选)

若需在 AOSP 外部开发独立 HAL 组件,可使用 Android NDK:

export NDK=~/android-ndk-r25c
export TOOLCHAIN=$NDK/toolchains/llvm/prebuilt/linux-x86_64
export CC=$TOOLCHAIN/bin/aarch64-linux-android31-clang
export CXX=$TOOLCHAIN/bin/aarch64-linux-android31-clang++
export AR=$TOOLCHAIN/bin/llvm-ar
export STRIP=$TOOLCHAIN/bin/llvm-strip
注意: AOSP 内部编译推荐使用 mmm / mm 方式,以自动处理依赖、头文件路径和链接标志。手动 NDK 编译仅用于独立测试或原型验证。

2.4 ADB 调试环境准备

ADB(Android Debug Bridge)是连接开发主机与目标设备的核心工具。AOSP 编译完成后,ADB 位于 out/host/linux-x86/bin/adb,也可单独安装平台工具包。

2.4.1 设备连接与权限

# 添加 USB 设备规则
echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"' | sudo tee /etc/udev/rules.d/51-android.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

# 验证连接
adb devices -l

2.4.2 刷机与调试常用命令

命令 用途
adb reboot bootloader 重启到 fastboot 模式
fastboot flashall 刷写所有分区镜像
adb root 以 root 权限重启 adbd
adb remount 重新挂载 system/vendor 为可写
adb push <local> <remote> 推送文件到设备
adb logcat -s CameraService 过滤 CameraService 日志

2.4.3 快速替换 HAL 库调试

adb root
adb remount
adb push out/target/product/raven/vendor/lib64/camera.raven.so /vendor/lib64/
adb shell sync
adb reboot
调试效率技巧: 使用 adb shell stop 和 adb shell start 重启 Android 服务层,可避免完整重启设备,将 HAL 库替换后的等待时间从 60 秒缩短到 10 秒以内。

2.5 开发环境整体流程

下图概括了从源码下载到设备调试的完整工具链与数据流:

Camera HAL 开发环境搭建流程 ① AOSP 源码下载 repo sync -j$(nproc) ② 编译 AOSP + HAL lunch + make -j$(nproc) ③ 编译产物 system.img / vendor.img ④ 单独编译 HAL 模块 mmm vendor/.../camera/ ⑤ ADB 推送至设备 adb push → /vendor/lib64/ ⑥ logcat / 功能验证 关键工具链 repo / make / clang adb / fastboot / logcat 目标设备 Pixel 6 / 模拟器 userdebug 版本

2.6 常见问题与避坑指南

磁盘空间不足: AOSP 完整编译需要至少 250 GB 空闲空间。建议使用 ccache 加速重复编译:export USE_CCACHE=1 && ccache -M 50G。
HAL 库签名验证失败: 替换 vendor 分区中的 HAL 库后,若设备启动时提示 dlopen failed: cannot locate symbol,通常是因为 HAL 库依赖的共享库版本不匹配。请确保 lunch 选择的目标设备与编译产物一致,并使用 adb remount 后同步推送所有相关 .so 文件。