3. AOSP 源码下载与编译:配置 repo 工具、下载指定 Android 版本源码(如 Android 14)、编译环境初始化、lunch 选择目标设备
搭建 Camera HAL 开发环境的核心第一步,是获取并编译一套完整的 Android 开源项目(AOSP)源码。本章将详细拆解从环境准备、repo 工具配置、源码下载、编译环境初始化到最终 lunch 选择目标设备的全流程,确保你获得一个可编译、可调试的 Camera HAL 开发基线。
3.1 整体流程概览
下图展示了从零开始搭建 AOSP 编译环境的完整工作流,涵盖工具链安装、源码同步与编译三大阶段。
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"
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 | 不下载标签,节省带宽与磁盘空间 |
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 | 开发阶段,功能验证 | 是 | 完整 | 无 |
| userdebug | Camera HAL 调试首选 | 是 | 部分 | 中等 |
| user | 发布版本,性能最优 | 否 | 无 | 完整 |
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 等关键镜像文件。
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文件。若缺失,需单独同步设备专属仓库。