3. Android源码下载与编译:AOSP源码下载方法、分支选择、lunch命令与编译目标选择、make编译流程

在Camera HAL开发中,掌握AOSP(Android Open Source Project)源码的下载与编译是搭建开发环境的核心技能。本章将系统讲解从源码获取到生成系统镜像的完整流程,重点覆盖分支选择策略、lunch命令的编译目标配置以及make编译系统的执行机制。

3.1 AOSP源码下载方法

AOSP源码体积庞大(通常超过50GB),官方推荐使用repo工具进行多仓库管理。repo是Google基于Git开发的Python脚本,用于同时操作数百个Git仓库。

3.1.1 环境准备与repo工具安装

# 安装Git与Python(Ubuntu 20.04/22.04)
sudo apt-get update
sudo apt-get install git-core python3 python3-pip

# 创建bin目录并加入PATH
mkdir -p ~/bin
export PATH=~/bin:$PATH

# 下载repo工具
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
网络加速建议: 国内开发者可使用清华或中科大AOSP镜像源。在初始化repo时添加 --repo-url 和 --no-repo-verify 参数,并在 .repo/local_manifests/ 中配置镜像地址。

3.1.2 初始化与同步

# 创建工作目录
mkdir aosp-source
cd aosp-source

# 初始化指定分支(以android-13.0.0_r41为例)
repo init -u https://android.googlesource.com/platform/manifest \
          -b android-13.0.0_r41 \
          --depth=1

# 同步全部源码(-jN 并行下载,N建议为CPU核心数2倍)
repo sync -j8 -c --no-tags
关键参数说明:
  • --depth=1:只下载最新版本,节省磁盘空间与网络流量
  • -c:仅同步当前分支,不获取其他分支
  • --no-tags:跳过标签下载,减少同步时间

3.2 分支选择策略

分支选择直接影响Camera HAL的开发基线。AOSP分支命名遵循 android-{API级别}.{大版本}.0_r{补丁号} 格式。下表列出Camera HAL开发常用的分支及其特性:

分支名称 Android版本 API级别 Camera HAL版本 适用场景
android-14.0.0_r30 14 (UpsideDownCake) 34 HAL3 + Extension 最新特性开发、多摄融合
android-13.0.0_r41 13 (Tiramisu) 33 HAL3 + CameraX 主流设备适配、稳定性验证
android-12.1.0_r27 12L (SnowCone) 32 HAL3 平板/折叠屏Camera适配
android-11.0.0_r48 11 (RedVelvetCake) 30 HAL3 存量项目维护、低端平台
分支选择避坑: 不要直接使用 master 分支进行Camera HAL开发。master分支处于持续开发状态,API可能不兼容,且缺少针对特定硬件的vendor补丁。始终选择带有 _r{数字} 后缀的稳定发布分支。

3.3 lunch命令与编译目标选择

lunch 命令是AOSP编译系统的入口,用于选择目标设备、构建类型和产品配置。其核心语法为:

lunch {product_name}-{build_variant}

3.3.1 编译目标组成

编译目标由两部分组成:

  • product_name:设备产品名称,定义在 device/ 或 vendor/ 目录下的 device.mk 中。例如 aosp_arm64、sdk_phone_x86_64、pixel_6。
  • build_variant:构建变体,决定系统镜像的调试能力和权限级别。
构建变体 特性 Camera HAL开发用途
eng 工程版,root权限,关闭优化 HAL调试、日志分析、快速迭代
userdebug 用户调试版,root权限,开启优化 性能测试、CTS验证、稳定性测试
user 用户版,无root,全优化 发布前最终验证、功耗测试

3.3.2 常用lunch组合

# 设置编译环境(必须在源码根目录执行)
source build/envsetup.sh

# 选择通用ARM64模拟器目标(Camera HAL开发常用)
lunch aosp_arm64-eng

# 选择Pixel 6设备目标(真机调试)
lunch pixel_6-userdebug

# 选择x86_64模拟器目标(快速编译验证)
lunch sdk_phone_x86_64-eng
Camera HAL开发推荐: 初期使用 aosp_arm64-eng 在模拟器上验证HAL接口逻辑;中期切换到 pixel_6-userdebug 在真机上测试硬件通路;发布前使用 pixel_6-user 进行最终验证。

3.4 make编译流程

AOSP编译系统基于GNU Make和Soong(Blueprint + Ninja)构建。完整的编译流程分为配置、解析、执行三个阶段。

AOSP make编译流程 阶段1:环境配置 source build/envsetup.sh 阶段2:目标选择 lunch <product>-<variant> 阶段3:编译执行 make -j$(nproc) 环境配置子步骤 1. 设置PATH、LD_LIBRARY_PATH 2. 加载Soong编译模块 3. 注册lunch函数与产品列表 目标选择子步骤 1. 解析product_name与variant 2. 加载BoardConfig.mk 3. 设置TARGET_PRODUCT等变量 编译执行子步骤 1. Kati解析Android.mk→Ninja 2. Soong编译Android.bp模块 3. Ninja执行并行构建任务 编译输出产物 out/target/product/{device}/ system.img boot.img / vendor.img camera.hal.so camera.provider.so

3.4.1 编译命令详解

# 完整编译(生成所有镜像)
make -j$(nproc) 2>&1 | tee build.log

# 增量编译Camera HAL模块(开发调试时使用)
make -j$(nproc) camera.hal

# 编译指定模块并重新打包vendor镜像
make -j$(nproc) vendorimage

# 编译并生成OTA升级包
make -j$(nproc) otapackage
编译参数优化:
  • -j$(nproc):使用所有CPU核心并行编译,Camera HAL模块编译可缩短至2-5分钟
  • 2>&1 | tee build.log:同时输出到终端和日志文件,便于排查编译错误
  • make clean:清理所有编译产物,在切换分支或修改BoardConfig后必须执行
  • make clobber:更彻底的清理,删除整个 out/ 目录

3.4.2 Camera HAL模块编译示例

当修改了Camera HAL源码后,无需重新编译整个系统,只需增量编译HAL模块并更新vendor镜像:

# 1. 编译camera HAL模块
make -j8 camera.hal

# 2. 查看编译产物
ls -l out/target/product/pixel_6/vendor/lib64/hw/camera.*.so

# 3. 重新打包vendor镜像
make -j8 vendorimage

# 4. 刷入设备(需进入fastboot模式)
fastboot flash vendor out/target/product/pixel_6/vendor.img
fastboot reboot
增量编译注意事项:
  • 修改 Android.bp 或 Android.mk 后,必须执行 make clean 再编译,否则可能出现链接错误
  • Camera HAL依赖的HAL接口定义(如 hardware/interfaces/camera/)变更时,需重新编译所有依赖模块
  • 使用 mm 命令(在模块目录下执行)可快速编译当前模块,但不会自动处理依赖关系

3.5 编译常见问题与排查

错误类型 典型现象 解决方案
Java版本不匹配 Unsupported class file major version 安装OpenJDK 11/17,设置 JAVA_HOME 环境变量
磁盘空间不足 No space left on device 保留至少150GB空闲空间,清理 out/ 目录
Python版本错误 SyntaxError: invalid syntax 使用Python 3.8+,设置 python 软链接指向python3
Ninja构建失败 ninja: build stopped: subcommand failed 查看 build.log 定位具体模块,执行 make clean 后重试
Camera HAL链接错误 undefined reference to 'camera_metadata' 检查 Android.bp 中 shared_libs 是否包含 libcamera_metadata
高效调试技巧: 在 build.log 中搜索 error: 关键字定位错误行。对于Camera HAL编译错误,重点关注 hardware/interfaces/camera/ 和 device/ 目录下的编译输出。使用 m 命令(替代 make)可自动设置 -j 参数并显示编译进度百分比。