2. 开发环境搭建:Ubuntu环境配置、AOSP源码下载、交叉编译工具链安装、内核编译环境准备

本章是实战课程的基石。一个稳定、可复现的开发环境能避免后续驱动调试中90%的“环境问题”。我们将从零开始,在Ubuntu 22.04 LTS上完成AOSP源码同步、交叉编译工具链配置以及内核编译环境的搭建。所有操作均基于命令行,确保与CI/CD流程一致。

硬件建议: 编译AOSP和内核需要至少16GB RAM(推荐32GB)、500GB可用磁盘空间(推荐SSD)以及4核以上CPU。如果使用虚拟机,请确保给足资源。

2.1 Ubuntu基础环境配置

首先,更新系统并安装必要的依赖包。这些包是AOSP和内核编译的公共依赖。

# 更新软件源
sudo apt update
sudo apt upgrade -y

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

# 安装Python3及repo工具
sudo apt install -y python3 python3-pip
sudo apt install -y repo
关键点: 务必安装 gcc-multilib 和 g++-multilib,否则在编译32位兼容库时会报错。

2.2 AOSP源码下载与同步

AOSP(Android Open Source Project)源码体积庞大(约80GB+),我们使用Google官方的 repo 工具进行管理。以下是标准流程:

  1. 创建目录并配置Git身份
  2. 初始化repo仓库(选择指定分支,如 android-14.0.0_r15)
  3. 同步源码(耗时较长,建议使用 -j4 或 -j8 加速)
# 1. 创建工作目录
mkdir -p ~/aosp
cd ~/aosp

# 2. 配置Git(必须,否则repo会报错)
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

# 3. 初始化repo(以Android 14为例)
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r15

# 4. 同步源码(-j4表示4个并行任务,根据CPU核心数调整)
repo sync -j4 -c --no-tags
网络注意事项: 如果无法直接访问Google源,请使用国内镜像(如中科大、清华AOSP镜像)。替换 repo init 中的URL为 https://mirrors.ustc.edu.cn/aosp/platform/manifest。

同步完成后,源码目录结构如下表所示:

目录/文件 说明
build/ 编译系统核心(Soong、Makefile)
kernel/ 通用内核代码(部分设备厂商会放在独立仓库)
hardware/ HAL层实现(libhardware、接口定义)
device/ 设备相关配置、BoardConfig、内核预编译镜像
vendor/ 厂商专有库、HAL实现、驱动二进制文件
out/ 编译输出目录(目标文件、镜像)
AOSP 源码同步流程 1. 环境准备 2. repo init 3. repo sync 4. 源码就绪 国内用户需配置镜像源

2.3 交叉编译工具链安装

Android驱动开发需要两套工具链:一套用于编译内核(通常使用 aarch64-linux-android- 或 arm-linux-androideabi-),另一套用于编译HAL层(使用AOSP自带的 clang 工具链)。

2.3.1 使用AOSP预编译工具链(推荐)

AOSP源码中已经包含了预编译的交叉工具链,位于 prebuilts/gcc/ 和 prebuilts/clang/ 目录下。我们只需要将其加入 PATH 即可。

# 设置环境变量(建议写入 ~/.bashrc)
export PATH=~/aosp/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export PATH=~/aosp/prebuilts/clang/host/linux-x86/clang-r487747/bin:$PATH

# 验证工具链
aarch64-linux-android-gcc --version
clang --version

2.3.2 独立安装(可选)

如果不想下载完整AOSP,也可以从Linaro或ARM官网下载独立工具链:

# 下载ARM64 GCC工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/aarch64-linux-gnu/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu.tar.xz
tar -xf gcc-linaro-*.tar.xz -C ~/toolchains
export PATH=~/toolchains/gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu/bin:$PATH
版本匹配: 内核编译对GCC版本敏感。Android 12+推荐使用Clang编译内核,GCC仅作为辅助。建议优先使用AOSP预编译的Clang工具链。

2.4 内核编译环境准备

Android内核通常基于Linux LTS版本,并包含大量Android特有补丁(如 android-4.14-stable)。我们以编译 common-kernel 为例:

  1. 获取内核源码(从AOSP的 kernel/ 目录或独立仓库)
  2. 配置内核(使用 defconfig 或 menuconfig)
  3. 编译内核镜像(生成 Image 或 zImage)
# 1. 进入内核目录
cd ~/aosp/kernel/common

# 2. 设置架构和交叉编译变量
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-

# 3. 使用默认配置(以GKI为例)
make defconfig

# 4. 编译内核(-j$(nproc) 使用所有CPU核心)
make -j$(nproc) Image.gz

# 5. 编译设备树(如果目标设备需要)
make -j$(nproc) dtbs

编译成功后,内核镜像位于 arch/arm64/boot/Image.gz,设备树文件位于 arch/arm64/boot/dts/。

内核编译环境准备流程 设置 ARCH & CROSS_COMPILE make defconfig make Image.gz 生成内核镜像 生成设备树(dtbs) GKI内核使用 defconfig

2.5 环境验证清单

完成上述步骤后,建议执行以下验证,确保环境可用:

验证项 命令 预期结果
AOSP源码完整性 repo status 无未合并的冲突,所有项目为 clean
交叉编译器可用 aarch64-linux-android-gcc --version 显示GCC版本信息(如 4.9.x)
Clang编译器可用 clang --version 显示Clang版本信息(如 17.0.x)
内核编译测试 make -j4 Image.gz 编译成功,生成 arch/arm64/boot/Image.gz
设备树编译测试 make dtbs 编译成功,生成 .dtb 文件
避坑指南: 如果 make defconfig 报错“arch/arm64/configs/defconfig: No such file or directory”,请确认当前在内核根目录,且已正确设置 ARCH=arm64。部分GKI内核使用 gki_defconfig。