3. AOSP 源码下载与编译:配置 repo 工具、下载指定 Android 版本源码(如 Android 14)、编译环境初始化、lunch 选择目标设备

搭建 Camera HAL 开发环境的核心第一步,是获取并编译一套完整的 Android 开源项目(AOSP)源码。本章将详细拆解从环境准备、repo 工具配置、源码下载、编译环境初始化到最终 lunch 选择目标设备的全流程,确保你获得一个可编译、可调试的 Camera HAL 开发基线。

3.1 整体流程概览

下图展示了从零开始搭建 AOSP 编译环境的完整工作流,涵盖工具链安装、源码同步与编译三大阶段。

AOSP 源码下载与编译流程 阶段一:环境准备 安装 Git / Python / curl 配置 Git 用户名与邮箱 阶段二:Repo 与源码 下载并安装 repo 工具 repo init 指定 Android 14 分支 repo sync 同步全部源码 阶段三:编译 source build/envsetup.sh lunch 选择目标设备 make -j$(nproc) 编译 关键说明 • 阶段一与阶段二可并行准备,但阶段三必须等待阶段二完成。 • 首次 repo sync 耗时较长(通常 1-3 小时),建议使用稳定的网络环境。 • 编译环境初始化(source envsetup.sh)每次新终端都需要执行。

3.2 配置 repo 工具

repo 是 Google 基于 Git 开发的仓库管理工具,专门用于管理包含数百个 Git 子仓库的 AOSP 项目。正确安装与配置 repo 是下载源码的前提。

3.2.1 安装前置依赖

在 Ubuntu 22.04 LTS 上执行以下命令安装基础工具包:

sudo apt update
sudo apt install -y git-core python3 python3-pip curl gnupg flex bison \
    build-essential zip unzip zlib1g-dev gcc-multilib g++-multilib \
    libc6-dev-i386 libncurses5 libncurses5-dev lib32ncurses-dev \
    x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils \
    xsltproc libssl-dev bc rsync

3.2.2 安装 repo 工具

推荐将 repo 安装到用户本地目录,避免污染系统路径:

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

将 ~/bin 添加到 PATH 环境变量(建议写入 ~/.bashrc):

echo 'export PATH="$HOME/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

3.2.3 配置 Git 全局信息

repo 依赖 Git 的用户信息进行提交记录,必须提前配置:

git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
建议:使用与 Gerrit 代码审核系统相同的邮箱地址,便于后续提交补丁时自动关联身份。

3.3 下载指定 Android 版本源码(Android 14)

Android 14 对应的 AOSP 标签为 android-14.0.0_r1(或后续安全补丁版本,如 android-14.0.0_r15)。以下步骤以 android-14.0.0_r1 为例。

3.3.1 创建工作目录

mkdir -p ~/aosp/android-14
cd ~/aosp/android-14

3.3.2 初始化 repo 仓库

repo init -u https://android.googlesource.com/platform/manifest \
    -b android-14.0.0_r1 --depth=1
参数说明
-u指定 manifest 仓库的 URL,即 AOSP 主清单地址
-b指定分支或标签,此处为 Android 14 正式版标签
--depth=1仅拉取最新提交,大幅减少下载量(推荐首次使用)

3.3.3 同步全部源码

repo sync -c -j4 --no-tags
参数说明
-c仅同步当前分支,不获取所有远程分支
-j4并行任务数,可根据 CPU 核心数调整(如 -j8)
--no-tags不下载标签,节省带宽与磁盘空间
注意:首次同步建议预留至少 80GB 磁盘空间。若网络中断,可重复执行 repo sync 继续未完成的任务,repo 会自动断点续传。

3.4 编译环境初始化

源码同步完成后,需要加载 AOSP 的编译环境脚本,该脚本会设置大量环境变量并注册编译命令。

3.4.1 加载编译环境

source build/envsetup.sh

执行成功后,终端会输出类似以下信息:

including device/asus/zenfone2/vendorsetup.sh
including device/generic/car/emulator/vendorsetup.sh
including device/generic/goldfish/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
...(省略部分输出)
including sdk/bash_completion/adb.bash

3.4.2 环境初始化后的可用命令

命令功能
lunch选择编译目标设备与构建类型
m在源码根目录执行 make 编译
mm编译当前模块及其依赖
mma编译当前模块及其所有依赖(包括跨目录)
cgrep在 C/C++ 文件中搜索内容
jgrep在 Java 文件中搜索内容

3.5 lunch 选择目标设备

lunch 命令用于指定编译的目标设备(Device)和构建类型(Build Type)。Camera HAL 开发通常选择与硬件平台匹配的 userdebug 类型,以获得 root 权限和调试符号。

3.5.1 查看可用目标

直接执行 lunch 不带参数,会列出所有支持的设备组合:

lunch

输出示例(部分):

You're building on Linux

Lunch menu... pick a combo:
     1. aosp_arm-eng
     2. aosp_arm64-eng
     3. aosp_x86_64-eng
     4. aosp_car_x86_64-userdebug
     5. aosp_husky-userdebug
     6. aosp_raven-userdebug
     7. aosp_tangorpro-userdebug
     ...

Which would you like? [aosp_arm-eng]

3.5.2 选择目标设备

对于 Pixel 设备(如 Pixel 7 Pro 代号 raven),选择对应的 userdebug 类型:

lunch aosp_raven-userdebug

或直接输入编号(如 6)后回车。

3.5.3 构建类型对比

构建类型适用场景adb root调试符号性能优化
eng开发阶段,功能验证是完整无
userdebugCamera HAL 调试首选是部分中等
user发布版本,性能最优否无完整
Camera HAL 开发推荐:始终选择 userdebug 类型。它既保留了 root 权限用于 adb root 和 setenforce 0,又具备一定的性能优化,适合日常调试与验证。

3.5.4 验证 lunch 结果

执行 lunch 后,环境变量 TARGET_PRODUCT 和 TARGET_BUILD_VARIANT 会被设置。可通过以下命令确认:

echo $TARGET_PRODUCT
echo $TARGET_BUILD_VARIANT

输出示例:

aosp_raven
userdebug

3.6 编译验证

完成 lunch 后,执行编译命令验证环境是否正常工作:

make -j$(nproc) 2>&1 | tee build.log

首次全编译耗时较长(约 1-3 小时,取决于机器性能)。编译成功后,输出目录位于 out/target/product/<设备代号>/,其中包含 system.img、vendor.img、boot.img 等关键镜像文件。

加速技巧:若仅修改 Camera HAL 相关模块,可使用 mma 或 mm 进行增量编译,大幅缩短编译时间。例如在 hardware/interfaces/camera 目录下执行 mma 仅编译 Camera HAL 接口库。

3.7 常见问题与避坑指南

  • repo sync 失败:检查网络代理设置,或尝试使用 --depth=1 减少数据量。若持续失败,可尝试 repo sync --force-sync。
  • Python 版本不兼容:AOSP 14 要求 Python 3.8+,使用 python3 --version 确认。若系统默认 Python 版本过低,可通过 update-alternatives 切换。
  • 磁盘空间不足:AOSP 全量源码约 40GB,编译产物额外占用 40-60GB。建议分配至少 120GB 可用空间。
  • lunch 后找不到目标:确认 device/ 和 vendor/ 目录下存在对应设备的 vendorsetup.sh 文件。若缺失,需单独同步设备专属仓库。