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
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)
repo sync 即可断点续传。
同步完成后,内核源码位于 kernel/ 目录下。以 Pixel 6/7 系列使用的 gs 内核为例:
ls kernel/google/gs/
# 输出:Android.bp BUILD.bazel Kbuild Makefile arch block crypto ...
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-
ARCH 改为 x86_64,CROSS_COMPILE 改为 x86_64-linux-android-,并对应调整工具链路径。
2.4.3 验证工具链
aarch64-linux-android-gcc --version
clang --version
# 输出应显示 Android NDK 或 AOSP 预置版本信息
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)。
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 即可快速进入开发状态。