2. 搭建Linux编译环境:Ubuntu系统安装与配置、必要软件包安装、JDK与SDK环境配置

Android内核与AOSP(Android Open Source Project)的编译对宿主操作系统有严格的要求。官方推荐使用 Ubuntu 18.04 LTS (Bionic Beaver) 或 Ubuntu 20.04 LTS (Focal Fossa) 的64位版本。本章将引导你从零开始,搭建一个稳定、可复现的编译环境。

环境选择建议: 虽然WSL2(Windows Subsystem for Linux)可以运行部分编译任务,但涉及内核模块加载、设备节点操作和fastboot烧录时,原生Linux系统或虚拟机(VMware/VirtualBox)桥接网络模式更为可靠。本课程所有操作均基于 Ubuntu 20.04 LTS 验证。

2.1 Ubuntu系统安装与基础配置

安装完成后,首要任务是更新软件源并配置基础开发工具。以下步骤确保系统处于最新状态,并安装编译AOSP所需的底层依赖。

# 1. 更新软件包列表并升级系统
sudo apt update
sudo apt upgrade -y

# 2. 安装基础编译工具链
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev \
gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc \
unzip fontconfig

# 3. 安装Python与Repo工具(AOSP多仓库管理)
sudo apt install -y python3 python3-pip
sudo ln -s /usr/bin/python3 /usr/bin/python
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH=~/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
关键依赖说明: libncurses5 和 lib32ncurses5-dev 用于支持32位编译目标;gcc-multilib 和 g++-multilib 允许在64位系统上交叉编译32位代码,这是编译早期Android版本(如Android 9及之前)的bootloader和内核时必须的。

2.2 必要软件包安装:分区与文件系统工具

内核编译和镜像打包过程中,需要处理磁盘镜像、文件系统映像和分区表。以下工具是必须安装的:

软件包名称 用途说明 安装命令
lzop LZO压缩算法工具,用于压缩内核映像 sudo apt install lzop
mkfs.ext4 (e2fsprogs) 创建ext4文件系统,用于system/vendor分区 sudo apt install e2fsprogs
mkfs.f2fs (f2fs-tools) 创建F2FS文件系统,用于userdata分区 sudo apt install f2fs-tools
parted 磁盘分区管理工具 sudo apt install parted
mtools 操作FAT32/DOS文件系统,用于boot分区 sudo apt install mtools
device-tree-compiler 设备树编译器(dtc),用于处理DTB sudo apt install device-tree-compiler
版本兼容性警告: 切勿使用 apt install default-jdk 安装OpenJDK的默认版本。Android 10及以下版本要求 OpenJDK 8,Android 11及以上版本要求 OpenJDK 11。错误的JDK版本会导致编译时出现 Unsupported class file major version 错误。

2.3 JDK环境配置:版本选择与多版本管理

Android编译系统对JDK版本有严格限制。我们使用 update-alternatives 实现多版本JDK共存与切换。

# 安装OpenJDK 8(用于Android 10及以下)
sudo apt install -y openjdk-8-jdk

# 安装OpenJDK 11(用于Android 11及以上)
sudo apt install -y openjdk-11-jdk

# 配置多版本管理
sudo update-alternatives --config java
sudo update-alternatives --config javac

# 验证当前JDK版本
java -version
javac -version

执行 sudo update-alternatives --config java 后,系统会列出已安装的JDK版本列表,输入对应数字即可切换。建议为每个Android版本项目单独设置 JAVA_HOME 环境变量:

# 在 ~/.bashrc 或项目根目录的 build/envsetup.sh 之前设置
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
最佳实践: 在AOSP源码根目录创建一个 setup_env.sh 脚本,将JDK路径、SDK路径和编译参数集中管理。每次开始编译前执行 source setup_env.sh,避免环境变量污染。

2.4 SDK环境配置:Android SDK与编译工具链

虽然AOSP编译主要依赖源码树内的预编译工具链,但部分外围工具(如 adb、fastboot、aapt)需要Android SDK的支持。我们安装 Command Line Tools 来获取这些工具。

# 1. 下载命令行工具(以Linux版本为例)
cd ~
wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip
unzip commandlinetools-linux-*.zip -d android-sdk
rm commandlinetools-linux-*.zip

# 2. 安装必要的SDK组件
cd ~/android-sdk/cmdline-tools/bin
./sdkmanager --sdk_root=~/android-sdk "platform-tools" "build-tools;30.0.3" "platforms;android-30"

# 3. 配置环境变量
echo 'export ANDROID_SDK_ROOT=~/android-sdk' >> ~/.bashrc
echo 'export PATH=$ANDROID_SDK_ROOT/platform-tools:$PATH' >> ~/.bashrc
echo 'export PATH=$ANDROID_SDK_ROOT/build-tools/30.0.3:$PATH' >> ~/.bashrc
source ~/.bashrc

# 4. 验证安装
adb version
fastboot --version
SDK版本选择: platforms;android-30 对应Android 11(API 30)。如果你的目标设备是Android 12或13,请相应修改为 android-31 或 android-33。编译工具链版本建议与AOSP源码中 build/soong/cc/config/global.go 定义的Clang版本保持一致。

2.5 编译环境验证与架构总览

完成上述所有步骤后,我们通过一个简单的SVG架构图来理解整个编译环境的层次关系,并执行最终验证。

Android 内核编译环境架构 宿主机硬件层 (x86_64 CPU / 16GB+ RAM / SSD) 操作系统层 (Ubuntu 20.04 LTS / 内核 5.4+) 基础依赖层 (git / python3 / repo / build-essential / libncurses5) JDK层 (OpenJDK 8 / 11) SDK层 (platform-tools / build-tools) 编译目标层 (AOSP源码 / 内核Image / 设备树DTB / 文件系统镜像) 硬件 OS 依赖 工具链 输出

执行以下命令进行最终验证,确保所有组件就绪:

# 验证JDK
java -version 2>&1 | grep "OpenJDK"
# 输出示例:openjdk version "1.8.0_292"

# 验证SDK工具
adb --version | head -n 1
# 输出示例:Android Debug Bridge version 1.0.41

# 验证Repo工具
repo --version | head -n 1
# 输出示例:<repo not installed> 或 repo version v2.29

# 验证内核编译工具
arm-linux-androideabi-gcc --version 2>/dev/null || echo "使用Clang工具链"
# 现代AOSP已默认使用Clang,gcc仅用于兼容旧版
环境就绪标志: 当 java -version 显示正确的JDK版本,adb devices 能识别连接的设备(或显示 List of devices attached 空列表),且 repo init 可以正常下载AOSP清单文件时,你的编译环境已完全就绪,可以进入下一章:AOSP源码下载与版本管理。