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)构建。完整的编译流程分为配置、解析、执行三个阶段。
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 参数并显示编译进度百分比。