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 小时
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 之间的框架层 |
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
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 开发环境整体流程
下图概括了从源码下载到设备调试的完整工具链与数据流:
2.6 常见问题与避坑指南
ccache 加速重复编译:export USE_CCACHE=1 && ccache -M 50G。
dlopen failed: cannot locate symbol,通常是因为 HAL 库依赖的共享库版本不匹配。请确保 lunch 选择的目标设备与编译产物一致,并使用 adb remount 后同步推送所有相关 .so 文件。