2. 编译Android系统镜像

任务说明

本案例目标是在已下载并完成环境配置的AOSP源码树中,通过lunch选择目标设备配置,再执行make完成系统编译,最终生成boot.img、system.img等镜像文件。适用于AOSP 10及以上版本,宿主机为Ubuntu 18.04/20.04 x86_64。

前置条件

  • 已下载AOSP源码(本例以android-10.0.0_r1为例),源码路径如~/aosp
  • 已安装JDK(AOSP 10需OpenJDK 9)、Python 3、make 3.82+、gcc/g++等编译工具链
  • 磁盘剩余空间建议≥200GB,内存≥16GB(推荐32GB)
  • 已执行source build/envsetup.sh初始化编译环境

关键实现

编译过程的核心是两条命令:lunch选择产品配置,make执行编译。以下为完整操作流程:

# 1. 进入源码根目录并初始化环境
cd ~/aosp
source build/envsetup.sh

# 2. 查看可用的产品配置(仅列出部分)
lunch

# 3. 选择目标设备(以Pixel 3模拟器镜像为例)
#    输入序号或直接指定完整名称
lunch aosp_x86_64-userdebug

# 4. 查看当前生效的编译配置(验证lunch成功)
echo $TARGET_PRODUCT   # 应输出 aosp_x86_64
echo $TARGET_BUILD_VARIANT  # 应输出 userdebug

# 5. 执行编译(-jN 中N为并行任务数,通常设为CPU核数的1~2倍)
#    首次编译建议先执行 make -j8 验证环境,再逐步增加并行数
make -j$(nproc)

# 6. 编译完成后,镜像输出目录
ls -lh out/target/product/generic_x86_64/*.img

编译产物位于out/target/product/<TARGET_PRODUCT>/目录下。核心镜像文件说明如下:

镜像文件内容生成条件
boot.img内核+ramdisk默认生成
system.img系统分区(Android框架、应用)默认生成
vendor.img厂商专有分区当产品配置包含vendor时生成
userdata.img用户数据分区默认生成
recovery.img恢复模式镜像当TARGET_NO_RECOVERY=false时生成

验证方法

编译成功的判定标准如下,满足全部条件即视为通过:

  1. make命令退出码为0,终端显示#### build completed successfully ####
  2. out/target/product/generic_x86_64/目录下存在boot.img和system.img文件
  3. 使用file命令检查镜像格式:file boot.img应输出Android boot image,file system.img应输出Android sparse image或ext4 filesystem(取决于编译配置)
  4. 镜像文件大小合理:boot.img约20~50MB,system.img约1~3GB(userdebug版本含调试工具)

常见问题

  • lunch报错“Couldn't locate the product”:确认产品名称拼写正确,执行lunch不带参数查看完整列表
  • 编译中断后继续:直接再次执行make -jN,增量编译会自动跳过已完成的模块
  • 磁盘空间不足:编译过程中out/目录会膨胀至100GB+,使用df -h监控剩余空间
  • jack-server错误(仅AOSP 9及以下):AOSP 10已移除jack,若使用旧版本需配置jack-admin

如需生成指定产品的镜像(如aosp_arm64),只需将lunch参数替换为目标产品名,其余步骤完全一致。编译产物目录名会随产品名变化,例如out/target/product/arm64/。