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项目提供的工具。安装与配置步骤如下:

  1. 安装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
  1. 配置Git身份:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
  1. 配置Git缓存(可选,加速后续操作):
git config --global credential.helper cache
网络注意事项:如果无法直接访问Google源,请配置代理或使用国内镜像源(如中科大、清华AOSP镜像)。Repo初始化时通过 --manifest-url 指定镜像地址。

2.2 AOSP源码下载与编译

本节以 Android 14 (UpsideDownCake) 分支为例,演示从源码下载到完整编译的完整流程。Camera HAL模块依赖AOSP的框架层和硬件抽象层接口,因此必须拥有完整的编译环境。

2.2.1 源码下载流程

下图展示了AOSP源码下载的完整工作流:

AOSP源码下载流程 1. repo init 2. repo sync 3. 切换分支 关键参数说明: - repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15 - 国内镜像:repo init -u https://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-14.0.0_r15 ⏱ 首次同步耗时:约1-2小时(取决于网络带宽),总数据量约60GB。 建议使用 repo sync -j4 -c 减少并发数,避免网络中断。

执行以下命令完成源码下载:

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=1
export CCACHE_DIR=~/.ccache
ccache -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中的位置及其内部组件关系:

Camera HAL模块架构 Android Framework (CameraService) Camera HAL3 Interface (ICameraProvider) Camera HAL Implementation (硬件抽象层) HAL Adapter (设备适配) Pipeline Manager (流水线管理) Sensor Driver (传感器驱动) 📁 典型路径:hardware/google/camera/ 或 vendor/qcom/proprietary/camera/ 📦 编译输出:out/target/product/<device>/vendor/lib64/hw/camera.<device>.so

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 方式详细步骤:

  1. 重启设备到可写状态:
adb root
adb remount
  1. 推送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/
  1. 重启CameraService:
adb shell pkill -f cameraserver
# 或重启整个设备
adb reboot
  1. 验证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,避免全编译。