2. 开发环境搭建:AOSP源码下载、内核源码编译、交叉编译工具链配置、模拟器与真机调试环境

搭建一套稳定、可复现的 Android 内核文件系统驱动开发环境,是后续所有实验与调试工作的基础。本章将引导你完成从 AOSP 源码同步、内核独立编译、交叉工具链配置到模拟器与真机调试的全流程搭建。环境采用 Ubuntu 22.04 LTS 作为宿主系统,推荐磁盘剩余空间不低于 400GB,内存不低于 32GB。

2.1 环境概览与依赖安装

开发环境的核心组件及其版本要求如下表所示。版本不匹配将直接导致编译失败或运行时异常。

组件 推荐版本 用途
Ubuntu 22.04 LTS (x86_64) 宿主操作系统
Python 3.8 ~ 3.11 构建脚本与工具
Git 2.25+ 源码版本管理
Repo v2.45+ AOSP 多仓库管理
OpenJDK 11 或 17 Android 构建系统依赖
GCC/LLVM 预置工具链 内核交叉编译
Make 4.3+ 构建调度

执行以下命令安装基础依赖包:

sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev libc6-dev-i386 libncurses5-dev x11proto-core-dev \
  libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig
sudo apt install -y python3 python3-pip openjdk-11-jdk
提示: 如果使用 Ubuntu 20.04,需手动安装 Python 3.8+ 并配置为默认 python3。建议使用 update-alternatives 管理多版本 Python。

2.2 AOSP 源码下载与同步

AOSP(Android Open Source Project)源码仓库包含 Android 框架、系统服务、原生库及内核源码引用。我们使用 Google 官方提供的 repo 工具进行多仓库并行同步。

2.2.1 安装 Repo 工具

mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=~/bin:$PATH

2.2.2 初始化与同步

选择一个稳定的 AOSP 分支,例如 android-14.0.0_r30(对应 Android 14 QPR3)。

mkdir -p ~/aosp/android-14
cd ~/aosp/android-14
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r30
repo sync -c -j$(nproc --all)
注意: 首次同步数据量约 80~120GB,耗时取决于网络带宽。建议使用代理或国内镜像源(如中科大、清华 AOSP 镜像)加速。同步过程中若中断,重新执行 repo sync 即可断点续传。

同步完成后,内核源码位于 kernel/ 目录下。以 Pixel 6/7 系列使用的 gs 内核为例:

ls kernel/google/gs/
# 输出:Android.bp  BUILD.bazel  Kbuild  Makefile  arch  block  crypto  ...
AOSP 源码目录结构(内核相关部分) aosp/android-14/ frameworks/ system/ kernel/ device/ google/gs/ common/ 内核独立编译时仅需 kernel/ 目录

2.3 内核源码独立编译

文件系统驱动开发通常只需编译内核,无需构建完整 AOSP。Android 从 12 开始推荐使用 BUILD.bazel 构建系统,但传统 Makefile 路径仍然可用。我们以 aosp_arm64 模拟器内核为例,演示独立编译流程。

2.3.1 设置环境变量

export KERNEL_DIR=~/aosp/android-14/kernel/google/gs
export OUT_DIR=~/kernel_out/gs
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-

2.3.2 使用 Bazel 编译(推荐)

cd $KERNEL_DIR
tools/bazel build --config=stamp //common:kernel_aarch64_dist
# 编译产物位于 bazel-bin/common/

2.3.3 使用传统 Makefile 编译

cd $KERNEL_DIR
make O=$OUT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE defconfig
make O=$OUT_DIR ARCH=$ARCH CROSS_COMPILE=$CROSS_COMPILE -j$(nproc)

编译完成后,内核镜像位于 $OUT_DIR/arch/arm64/boot/Image,内核模块位于 $OUT_DIR/drivers/ 下对应子目录。

关键检查点: 编译成功后,务必检查 Image 文件大小是否在合理范围(通常 30~80MB)。若生成文件过小(如几 KB),说明编译配置出错或链接阶段失败。

2.4 交叉编译工具链配置

Android 内核必须使用 Android NDK 提供的交叉编译工具链,或 AOSP 预置的 prebuilts/gcc/ 与 prebuilts/clang/。推荐使用 Clang/LLVM 工具链,Google 已逐步弃用 GCC。

2.4.1 工具链路径

AOSP 同步完成后,预置工具链位于:

# GCC 工具链(备用)
prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/

# LLVM/Clang 工具链(推荐)
prebuilts/clang/host/linux-x86/clang-r487747/bin/

2.4.2 配置环境变量

export PATH=~/aosp/android-14/prebuilts/clang/host/linux-x86/clang-r487747/bin:$PATH
export PATH=~/aosp/android-14/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin:$PATH
export CROSS_COMPILE=aarch64-linux-android-
export CC=clang
export CLANG_TRIPLE=aarch64-linux-gnu-
提示: 如果使用模拟器(x86_64 架构),需将 ARCH 改为 x86_64,CROSS_COMPILE 改为 x86_64-linux-android-,并对应调整工具链路径。

2.4.3 验证工具链

aarch64-linux-android-gcc --version
clang --version
# 输出应显示 Android NDK 或 AOSP 预置版本信息
交叉编译工具链调用关系 内核源码 (C/ASM) Clang (CC) / GCC GNU AS (汇编器) LLD / GNU LD (链接器) objcopy / strip Image / *.ko

2.5 模拟器调试环境

Android 模拟器(Emulator)是内核驱动开发初期最便捷的验证平台。它基于 QEMU,支持自定义内核镜像启动。

2.5.1 编译模拟器内核

cd ~/aosp/android-14
source build/envsetup.sh
lunch sdk_phone_x86_64-userdebug
make -j$(nproc) kernel
# 内核镜像生成于 out/target/product/emulator_x86_64/kernel-5.15

2.5.2 使用自定义内核启动模拟器

emulator -kernel out/target/product/emulator_x86_64/kernel-5.15 \
         -show-kernel -no-window -memory 2048 \
         -system out/target/product/emulator_x86_64/system.img \
         -data out/target/product/emulator_x86_64/userdata.img

参数说明:

  • -show-kernel:在终端打印内核日志(dmesg),便于驱动调试。
  • -no-window:不启动图形界面,节省资源。
  • -memory:分配内存大小(MB)。
注意: 模拟器内核与 AOSP 系统镜像版本必须严格匹配。使用 sdk_phone_x86_64-userdebug 编译出的系统镜像,必须搭配同一次编译生成的内核,否则可能出现无法开机或驱动不兼容。

2.6 真机调试环境

真机调试能验证驱动在真实硬件上的行为。以 Pixel 6 系列为例,需要解锁 bootloader 并刷入自定义内核。

2.6.1 解锁 Bootloader

adb reboot bootloader
fastboot flashing unlock
# 按音量键确认解锁(会清除所有数据)
fastboot reboot

2.6.2 刷入自定义内核

# 进入 fastboot 模式
adb reboot bootloader
# 刷入内核 boot 镜像
fastboot flash boot out/target/product/raven/boot.img
# 或仅刷入内核(如果设备支持)
fastboot flash kernel arch/arm64/boot/Image
fastboot reboot

2.6.3 内核日志捕获

# 实时查看内核日志
adb shell dmesg -w
# 保存日志到文件
adb shell dmesg > kernel_log.txt
# 过滤文件系统驱动相关日志
adb shell dmesg | grep -i "f2fs\|ext4\|sdcardfs\|overlay"
提示: 真机调试时,建议使用 userdebug 版本系统镜像,它保留了 root 权限和完整的 dmesg 访问能力。生产环境 user 版本会限制 dmesg 输出。

2.7 开发环境验证清单

完成上述步骤后,使用下表逐项验证环境是否就绪:

验证项 验证方法 预期结果
AOSP 源码完整性 repo status 所有仓库显示为 clean 或已同步
内核编译 make defconfig && make -j4 生成 arch/arm64/boot/Image
交叉工具链 aarch64-linux-android-gcc --version 显示 AOSP 预置版本号
模拟器启动 emulator -kernel ... 模拟器正常启动,adb shell 可连接
真机刷机 fastboot flash boot boot.img 设备重启后正常进入系统
内核日志 adb shell dmesg 输出包含内核版本及驱动加载信息
最佳实践: 建议将上述环境配置写成自动化脚本(如 setup_env.sh),包含依赖安装、工具链导出、编译命令别名等。每次开启新终端时执行 source setup_env.sh 即可快速进入开发状态。