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 工具进行管理。以下是标准流程:
- 创建目录并配置Git身份
- 初始化repo仓库(选择指定分支,如
android-14.0.0_r15) - 同步源码(耗时较长,建议使用
-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/ |
编译输出目录(目标文件、镜像) |
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 为例:
- 获取内核源码(从AOSP的
kernel/目录或独立仓库) - 配置内核(使用
defconfig或menuconfig) - 编译内核镜像(生成
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/。
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。