第一章 课程导入:学习目标、AOSP构建系统全景图、课程路径与实战环境准备
Android构建系统是AOSP(Android Open Source Project)中连接源码、工具链、产品配置与最终镜像的枢纽工程。它决定了你能否高效地完成一次全量编译、能否精准地裁剪系统组件、能否在新增硬件抽象层(HAL)后快速集成进系统镜像。本章作为整个课程的起点,将帮助你建立对AOSP构建系统的整体认知框架,明确学习路径,并完成本地实战环境的搭建。我们将从宏观全景图出发,逐步拆解构建系统的核心组件与数据流,最终让你在自己的机器上成功运行第一次完整的编译流程。
上图展示了AOSP构建系统的核心骨架。左侧是构建输入,包括模块定义文件(Android.bp 和 Android.mk)以及产品级配置(BoardConfig.mk、product.mk)。中间是核心引擎,Soong负责解析Blueprint语法并生成Ninja构建规则,而Kati则负责将传统的Makefile转换为Ninja文件。右侧是最终产物,即各种系统镜像文件。底部两层分别代表辅助工具链和配置管理,它们贯穿整个构建过程。理解这张图,你就掌握了AOSP构建系统的宏观脉络。
1.1 学习目标与课程路径
本课程旨在帮助你从零开始,系统性地掌握AOSP构建系统的原理、配置与实战技巧。课程内容分为四个阶段,每个阶段都有明确的能力目标。
| 阶段 | 核心主题 | 能力目标 |
|---|---|---|
| 第一阶段(第1-5章) | 构建系统基础与环境搭建 | 理解构建全景图;掌握源码下载、环境配置、首次编译;熟悉常见编译命令 |
| 第二阶段(第6-15章) | 核心机制与模块编写 | 精通Soong/Blueprint语法;掌握模块类型(cc_library、android_app等);理解产品配置与变体 |
| 第三阶段(第16-25章) | 高级定制与性能优化 | 自定义HAL集成;系统签名与权限管理;构建缓存与分布式编译;镜像定制与分区调整 |
| 第四阶段(第26-30章) | 实战项目与问题排查 | 独立完成一个系统级功能模块的集成;掌握构建日志分析与常见错误修复 |
在开始学习之前,建议你具备以下基础:熟悉Linux命令行操作,了解基本的C/C++或Java编程,对Makefile有初步认识。如果你对Makefile不熟悉,不必担心,课程中会详细讲解Soong与Blueprint,这是当前AOSP主推的构建语言。
1.2 AOSP构建系统全景图深度解析
让我们深入剖析全景图中的每个组件。AOSP构建系统经历了从GNU Make到Soong的演进。在Android 7.0及之前,构建系统完全基于Makefile,通过大量的.mk文件定义模块。这种方式的缺点是解析速度慢、依赖关系复杂、难以调试。从Android 8.0开始,Google引入了Soong构建系统,使用Blueprint语言(.bp文件)来定义模块,并最终通过Ninja来执行构建任务。
当前AOSP构建系统的核心流程可以概括为以下步骤:
- 环境初始化: 执行
source build/envsetup.sh加载一系列Shell函数,如lunch、m、mm等。 - 产品选择: 运行
lunch命令,选择目标产品(如aosp_arm64)和构建变体(如userdebug)。这会设置TARGET_PRODUCT、TARGET_BUILD_VARIANT等关键环境变量。 - 解析构建规则: Soong读取所有
Android.bp文件,Kati读取所有Android.mk文件,将它们统一转换为build.ninja文件。 - 执行构建: Ninja根据
build.ninja中的规则,以并行方式执行编译、链接、打包等任务。 - 生成镜像: 最终生成
system.img、vendor.img、boot.img等镜像文件,存放在out/target/product/<product_name>/目录下。
为了更清晰地理解各组件职责,请参考下表:
| 组件 | 输入 | 输出 | 核心职责 |
|---|---|---|---|
| Soong | Android.bp | Ninja规则(部分) | 解析Blueprint语法,生成模块构建规则,处理依赖关系 |
| Kati | Android.mk | Ninja规则(部分) | 将Makefile转换为Ninja文件,兼容旧版模块 |
| Ninja | build.ninja | 目标文件/镜像 | 高性能并行执行构建任务,关注增量构建 |
| envsetup.sh | Shell环境 | Shell函数 | 提供 lunch、m、mm 等便捷命令 |
| lunch | 产品/变体参数 | 环境变量 | 配置 TARGET_PRODUCT、TARGET_BUILD_VARIANT 等 |
1.3 实战环境准备与首次编译
环境准备是AOSP开发的第一步,也是很多初学者容易受挫的地方。下面我们以Ubuntu 20.04 LTS 64位系统为例,详细说明环境配置步骤。
1.3.1 硬件与软件要求
- 硬件: 至少16GB内存(推荐32GB),8核以上CPU,400GB可用磁盘空间(推荐使用SSD)。
- 操作系统: Ubuntu 20.04/22.04 LTS,或macOS 12+(仅限Intel或Apple Silicon)。
- 软件包: 需要安装OpenJDK(Android 12及以上版本使用JDK 11)、Git、Python 3、以及一系列构建工具。
安装必要的软件包,执行以下命令:
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
sudo apt install -y openjdk-11-jdk
sudo apt install -y python3 python3-pip
1.3.2 下载AOSP源码
由于网络原因,推荐使用清华大学或中科大的AOSP镜像。以下是使用清华镜像的步骤:
mkdir ~/aosp
cd ~/aosp
# 初始化仓库
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r41
# 同步源码(耗时较长,建议使用 -j 参数并行下载)
repo sync -j8
repo sync 继续下载。
1.3.3 首次编译实战
源码下载完成后,我们进行首次编译。以模拟器使用的 aosp_arm64 产品为例:
cd ~/aosp
source build/envsetup.sh
lunch aosp_arm64-userdebug
# 开始编译(-j 参数指定并行任务数,通常为CPU核心数的2倍)
make -j16
编译过程会输出大量日志。当看到 #### build completed successfully #### 时,表示编译成功。生成的镜像文件位于 out/target/product/generic/ 目录下。
为了验证编译结果,你可以启动模拟器:
emulator
如果模拟器成功启动并显示Android界面,说明你的环境搭建和首次编译已经圆满完成。
1.4 常见误区与总结复盘
在环境准备和首次编译过程中,初学者常会遇到以下问题,我们逐一分析并给出解决方案。
| 常见误区 | 现象描述 | 解决方案 |
|---|---|---|
| 磁盘空间不足 | 编译过程中报 No space left on device |
使用 df -h 检查磁盘空间;清理 out/ 目录(make clean)或扩展磁盘 |
| 内存不足 | 编译时系统卡死或OOM(内存溢出) | 减少 -j 参数值;增加Swap空间;关闭其他大型应用 |
| JDK版本错误 | 编译报错 Unsupported class file major version |
确认使用JDK 11(java -version);切换默认JDK版本 |
未执行 source 命令 |
提示 lunch: command not found |
每次打开新终端,必须先执行 source build/envsetup.sh |
| 使用sudo编译 | 编译过程中出现权限错误 | 不要使用 sudo make,以普通用户身份编译;确保源码目录属主为当前用户 |
总结本章内容,我们完成了三件关键任务:第一,明确了课程的学习目标与四阶段路径;第二,从宏观上理解了AOSP构建系统的核心组件(Soong、Kati、Ninja)及其数据流;第三,成功搭建了本地编译环境并完成了首次全量编译。构建系统是一个庞大而精密的工程,本章为你打下了坚实的基础。在后续章节中,我们将深入Soong的语法细节,学习如何编写自己的构建模块,并逐步掌握系统定制的高级技巧。