1. AOSP源码下载与编译环境搭建:repo sync、构建脚本、make选项

AOSP(Android Open Source Project)的源码下载与编译环境是Framework层ActivityManager定制的基础。本章完整讲解从零搭建编译环境的完整链路,包括系统依赖、repo工具使用、构建脚本结构以及make核心选项,并针对常见错误给出可复现的解决方案。

AOSP源码下载与编译流程 ① 环境准备 ② repo init ③ repo sync ④ 选择构建目标 ⑤ source环境变量 ⑥ lunch ⑦ make -jN ⚠️ 注意 需要确保磁盘剩余空间>80GB 建议使用ext4文件系统

1.1 环境要求与依赖安装

编译AOSP至少需要64位Linux系统(推荐Ubuntu 20.04 / 22.04 LTS)、16GB以上物理内存(建议32GB)、250GB空闲磁盘。主要依赖通过以下命令安装:

sudo apt update
sudo apt install git gnupg flex bison gperf build-essential zip curl zlib1g-dev \
  gcc-multilib g++-multilib libc6-dev-i386 libncurses5 x11proto-core-dev \
  libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
效率提示: 如果网络条件较差,可以在 ~/.bashrc 中为 git 配置代理,加快 repo sync 速度。

1.2 repo 工具与源码清单管理

Google 使用 repo 工具管理 AOSP 数百个 git 仓库。安装方式:

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

初始化 manifest 仓库(以 Android 14 分支为例):

mkdir ~/aosp14 && cd ~/aosp14
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15

下载全部源码(单线程或指定并行数):

repo sync -c -j4   # -c 只下载当前分支,-j4 使用4线程下载
参数用途建议值
-c只同步当前分支(节省磁盘)总是使用
-jN并行下载数4~8(视网络与磁盘IO)
--force-sync强制覆盖本地修改偶发冲突时使用
--no-clone-bundle禁用克隆包(用于走代理)遇到SSL错误时尝试
常见错误: fatal: unable to access ... SSL certificate problem —— 可尝试 git config --global http.sslVerify false 或配置正确的CA证书。

1.3 构建脚本体系与 Makefile 结构

AOSP 构建系统基于 GNU Make,顶层 Makefile 在源码根目录。核心脚本文件:

  • build/make/core/main.mk —— 主入口,加载全局变量和目标规则
  • build/envsetup.sh —— 提供 lunch、m、mm、mma 等快捷命令
  • build/soong/ —— (Android 7+) 使用 Blueprint/Soong 替代部分 Make,但最终仍通过 make 驱动

标准编译序列(以 aosp_car_x86_64-eng 为例):

source build/envsetup.sh
lunch aosp_car_x86_64-eng
make -j$(nproc)

1.4 make 选项详解

选项说明示例
-jN并行编译任务数make -j16
SHOW_COMMANDS=1打印每条编译命令make SHOW_COMMANDS=1
BUILD_CONFIG=xxx指定自定义构建配置(.mk文件)make BUILD_CONFIG=mybuild.mk
droid默认目标,生成 system.imgmake droid
clean清理所有编译产物make clean
clobber彻底清理(包括中间文件)make clobber

可以通过 make showcommands 获取详细的构建日志用于分析编译错误。对于定制 ActivityManager,建议首次全编译后使用 mm(编译当前模块)加速调试循环:

cd frameworks/base/services/core
mm -j8

1.5 验证编译环境

编译完成后应输出类似以下内容的日志:

#### build completed successfully (03:45:12 (hh:mm:ss)) ####

产物目录 out/target/product/<device>/ 下应包含 system.img、ramdisk.img、boot.img 等关键镜像。

性能优化建议:
1. 使用 ccache 加速重复编译:export USE_CCACHE=1 && ccache -M 50G
2. 将 out/ 目录挂载到 tmpfs 或 SSD 分区
3. 首次编译使用 make -jN N 值不超过 CPU 物理线程数的 1.5 倍

1.6 常见错误排查

  • “Permission denied” —— 检查 repo 和编译文件夹所有者,避免使用 sudo make,建议 chown -R user:user ~/aosp
  • “out of memory” —— 降低 -j 值,或增加 swap 空间
  • “ninja: build stopped: subcommand failed” —— 查看具体错误(通常在上方),如缺少库则按 1.1 补装
  • “revision ... not found” —— 检查 manifest 分支名是否正确,或 repo sync --force-sync 重置

完成本章环境搭建后,即可进入第2章源码目录结构解析,精确定位 ActivityManager 相关代码位置。