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架构图来理解整个编译环境的层次关系,并执行最终验证。
执行以下命令进行最终验证,确保所有组件就绪:
# 验证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源码下载与版本管理。