3. 开发环境搭建

AOSP 源码体量庞大、构建链路长,对主机环境的要求远高于普通应用开发。一个稳定、可复现的构建环境,是后续编译、刷机与平台移植工作的地基。本章围绕 Ubuntu 主机配置、JDK 与依赖安装、repo 工具使用、源码下载与磁盘空间规划五个环节,梳理出一套可落地的环境搭建流程。

一、核心原理:为什么 AOSP 对环境如此敏感

AOSP 构建系统由 Soong、Ninja、Kati、Make 等多层工具协同驱动,编译过程会调用大量主机侧工具链(如 clang、bison、flex、libssl、python3 等)。任何一个依赖缺失或版本不匹配,都可能在编译中途报出难以定位的错误。因此环境搭建的核心目标不是“装上就行”,而是版本可控、依赖完整、路径规范、空间充足。

推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 的 64 位版本。LTS 版本软件包稳定、社区资料丰富,能显著降低踩坑概率。主机建议配置:CPU 8 核以上、内存 16GB 起步(32GB 更佳)、SSD 固态硬盘、可用磁盘空间 400GB 以上。若使用虚拟机,需开启嵌套虚拟化并分配足够资源,否则编译速度会严重拖慢。

环境搭建的四个关键约束:操作系统版本、JDK 版本、依赖包完整性、磁盘空间与文件系统类型。四者缺一不可,且相互影响。

二、JDK 与依赖安装

不同 Android 版本对 JDK 要求不同。Android 13 及以后通常使用 OpenJDK 11,部分新版本已迁移到 JDK 17。安装前应先确认目标源码分支的官方要求,避免版本错配导致 Soong 解析失败。

# 安装 OpenJDK 11
sudo apt update
sudo apt install -y openjdk-11-jdk

# 验证版本
java -version
javac -version

# 配置 JAVA_HOME(写入 ~/.bashrc)
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH

依赖包安装是环境搭建中最容易被忽视的一步。AOSP 官方文档给出了完整的软件包清单,建议一次性安装,避免编译过程中反复补包。

sudo apt install -y git-core gnupg flex bison build-essential zip curl \
  zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev \
  libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip \
  fontconfig python3 python3-pip ccache

其中 ccache 用于缓存编译产物,能大幅缩短二次编译时间;lib32ncurses5-dev 等 32 位库用于兼容部分主机工具。安装完成后建议执行 sudo apt upgrade 保持系统更新。

三、repo 工具使用与源码下载

AOSP 由数百个 Git 仓库组成,repo 是 Google 提供的多仓库管理工具,用于统一同步、分支切换与批量操作。安装 repo 的步骤如下:

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

# 配置 Git 身份
git config --global user.name "Your Name"
git config --global user.email "you@example.com"

下载源码时,先创建源码目录并初始化仓库,再执行同步。以 Android 13 为例:

mkdir -p ~/aosp/android-13
cd ~/aosp/android-13
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r1
repo sync -c -j8 --no-tags --no-clone-bundle

参数说明:-c 只同步当前分支,-j8 使用 8 个并发任务,--no-tags 跳过标签,--no-clone-bundle 避免使用预打包文件。国内网络环境可配置镜像源加速,例如使用清华或中科大镜像替换 manifest 地址。

repo sync 支持断点续传,中断后重新执行即可。若某仓库反复失败,可单独进入该仓库目录执行 git fetch 排查网络问题。

四、磁盘空间规划与文件系统选择

AOSP 源码本身约 100GB,加上编译产物(out 目录)通常需要 200GB 以上,完整构建后总占用可达 300~400GB。因此磁盘规划必须提前做好,避免编译中途空间不足。

项目典型占用说明
源码仓库约 100GB含 .repo 与各子仓库
out 编译产物150~250GB随目标设备与构建类型变化
ccache 缓存20~50GB可配置上限
系统与工具30GBUbuntu 与依赖包
建议总空间≥400GBSSD 优先

文件系统建议使用 ext4,避免在 NTFS 或 exFAT 上构建,因为 AOSP 大量使用符号链接与大小写敏感路径,Windows 文件系统会导致同步或编译失败。若使用虚拟机,应选择“固定大小”磁盘而非动态扩展,以减少碎片与性能损耗。

五、案例场景与常见误区复盘

某团队在 Ubuntu 22.04 上首次编译 Android 13,repo sync 完成后执行 source build/envsetup.sh 报出 Python 版本错误。排查发现系统默认 python 指向 python3.10,而部分脚本仍依赖 python2 风格的语法。解决方式是安装 python-is-python3 并确认脚本兼容性,或切换到官方推荐的 Python 版本。

另一个高频问题是磁盘空间不足。开发者常将源码放在 200GB 的分区,编译到 70% 时提示 “No space left on device”。此时清理 out 目录只能临时缓解,根本方案是重新规划分区或挂载独立数据盘。

  • 误区一:JDK 版本随意选择,导致 Soong 解析失败。
  • 误区二:依赖包只装一部分,编译中途反复报缺库。
  • 误区三:使用动态扩展虚拟磁盘,编译后期 IO 性能骤降。
  • 误区四:repo sync 不使用并发参数,同步耗时数小时。
  • 误区五:忽略 ccache 配置,重复编译浪费大量时间。
环境搭建完成后,建议先执行一次完整编译验证(如 lunch aosp_arm64-userdebug && make -j8),确认工具链与依赖无误,再进入后续的平台移植工作。首次编译耗时较长,属于正常现象。
AOSP 开发环境搭建流程与磁盘规划 Ubuntu 主机 20.04 / 22.04 LTS JDK 安装 OpenJDK 11 / 17 依赖包安装 git / flex / bison 等 repo 工具 init / sync 源码下载:repo init + repo sync -c -j8 android-13.0.0_r1 / 镜像加速 / 断点续传 磁盘空间规划(建议 ≥400GB SSD / ext4) 源码仓库 ~100GB out 编译产物 150~250GB ccache 20~50GB ⚠ 避免 NTFS/exFAT;虚拟机使用固定磁盘;编译前确认剩余空间 首次完整编译建议预留 2 小时以上,并开启 ccache 加速二次构建