2. 开发环境搭建:Ubuntu系统配置、交叉编译工具链安装、Android内核源码下载与编译、模拟器与真机调试环境准备

在开始编写第一个GPIO驱动之前,必须搭建一套完整、可验证的Android内核开发环境。本章将引导你完成从Ubuntu基础配置到真机调试的全流程,确保后续的驱动代码能够正确编译并加载到目标设备上。

2.1 Ubuntu系统基础配置

推荐使用 Ubuntu 20.04 LTS 或 22.04 LTS 作为宿主系统。最低硬件要求:CPU 4核以上、内存16GB、磁盘空间200GB以上。

⚠️ 避坑提示: 不要使用Windows子系统WSL1进行内核编译,WSL2在文件系统性能上仍存在瓶颈。强烈建议使用原生Linux系统或虚拟机(VMware/VirtualBox)安装Ubuntu桌面版。

2.1.1 安装基础依赖包

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

# 安装内核编译与Android开发必备工具
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 python3-pip python3-venv openjdk-11-jdk
💡 版本说明: Android 12及以上版本要求OpenJDK 11,Android 10及以下版本使用OpenJDK 8。请根据你下载的内核分支选择对应JDK版本。

2.1.2 配置Git与Repo工具

Android内核源码使用 repo 工具管理多个Git仓库,需要单独安装并配置。

# 安装repo工具
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

# 配置环境变量(写入~/.bashrc)
export PATH=~/bin:$PATH
export USE_CCACHE=1
export CCACHE_DIR=~/.ccache

# 配置Git用户信息
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"

2.2 交叉编译工具链安装

Android内核不能在x86_64的PC上直接编译运行,必须使用交叉编译工具链生成ARM64架构的可执行代码。以下是两种主流方案。

方案 工具链来源 适用场景 推荐指数
AOSP预编译工具链 Android源码树中的 prebuilts/gcc/ 与AOSP内核版本严格匹配,稳定性最高 ⭐⭐⭐⭐⭐
Linaro GCC Linaro官方发布的独立工具链 通用嵌入式开发,版本更新快 ⭐⭐⭐⭐
Clang/LLVM AOSP预编译Clang Android 12+内核官方推荐编译器 ⭐⭐⭐⭐⭐

2.2.1 安装AOSP预编译GCC工具链

下载Android内核源码后,工具链位于 prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin/ 目录下。也可以单独下载:

# 下载ARM64 GCC 4.9工具链
git clone https://android.googlesource.com/platform/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9 \
  -b android-12.0.0_r1

# 添加到PATH
export PATH=$(pwd)/aarch64-linux-android-4.9/bin:$PATH

2.2.2 安装Clang工具链(Android 12+推荐)

# 从AOSP下载预编译Clang
git clone https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86 \
  -b android-12.0.0_r1

# 设置环境变量
export PATH=$(pwd)/linux-x86/clang-r416183b/bin:$PATH
export CC=clang
export LD=ld.lld
⚠️ 关键配置: 使用Clang编译内核时,必须同时设置 CC=clang 和 LD=ld.lld,否则链接阶段会报错。GCC工具链则不需要单独设置LD。

2.3 Android内核源码下载与编译

Android内核源码分为 通用内核(Common Kernel) 和 设备专用内核(Device Kernel)。本课程以通用内核 android-12.0.0_r1 分支为例,该分支基于Linux 5.10 LTS。

2.3.1 下载内核源码

# 创建工作目录
mkdir -p ~/android-kernel && cd ~/android-kernel

# 使用repo初始化并同步源码(约8-15GB)
repo init -u https://android.googlesource.com/kernel/manifest \
  -b android-12.0.0_r1
repo sync -j$(nproc) --no-tags
💡 网络优化: 如果下载速度慢,可以使用国内镜像源替换 https://android.googlesource.com 为 https://mirrors.tuna.tsinghua.edu.cn/git/AOSP 或 https://mirrors.ustc.edu.cn/aosp。

2.3.2 编译内核

以下SVG图展示了内核编译的完整流程,从配置到生成可烧录镜像。

Android内核编译流程 1. 源码准备 repo sync 完成 2. 内核配置 make defconfig / menuconfig 3. 编译内核 make -j$(nproc) 4. 生成镜像 Image.gz + dtb 5. 打包boot.img mkbootimg + ramdisk 6. 烧录测试 fastboot flash boot 📌 关键说明: • 编译产物:arch/arm64/boot/Image.gz 和 arch/arm64/boot/dts/.../*.dtb • 打包命令:mkbootimg --kernel Image.gz --dtb dtb.img --ramdisk ramdisk.img -o boot.img • 烧录命令:fastboot flash boot boot.img && fastboot reboot

2.3.3 执行编译命令

# 进入内核源码根目录
cd ~/android-kernel/common

# 生成默认配置(以ARM64为例)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- \
  defconfig

# 自定义配置(可选,用于启用GPIO调试选项)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- \
  menuconfig

# 开始编译(使用16线程)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- \
  -j$(nproc)

# 编译完成后检查产物
ls -lh arch/arm64/boot/Image.gz
✅ 编译成功标志: 终端输出 Kernel: arch/arm64/boot/Image.gz is ready,且Image.gz文件大小在10-30MB之间。如果文件小于5MB,说明配置可能遗漏了关键驱动。

2.4 模拟器与真机调试环境准备

调试环境分为 模拟器(QEMU/Android Emulator) 和 真机(开发板/手机) 两种。模拟器适合早期驱动逻辑验证,真机用于最终功能测试。

2.4.1 模拟器环境搭建

使用 QEMU 模拟ARM64虚拟机,加载自定义编译的内核镜像。

# 安装QEMU
sudo apt install -y qemu-system-arm qemu-efi-aarch64

# 下载ARM64根文件系统(使用Buildroot或Debian)
wget https://releases.linaro.org/components/kernel/lt-5.10/arm64/lt-5.10.0-20231020-image.tar.gz
tar -xzf lt-5.10.0-20231020-image.tar.gz

# 启动QEMU虚拟机,加载自定义内核
qemu-system-aarch64 \
  -machine virt -cpu cortex-a57 -smp 4 -m 2048 \
  -kernel ~/android-kernel/common/arch/arm64/boot/Image.gz \
  -append "console=ttyAMA0 root=/dev/vda rw" \
  -drive file=rootfs.ext4,format=raw,if=virtio \
  -netdev user,id=net0 -device virtio-net,netdev=net0 \
  -nographic
💡 模拟器调试技巧: 在QEMU启动参数中添加 -s -S 可以启用GDB远程调试,在宿主机上使用 gdb-multiarch vmlinux 连接 localhost:1234 进行内核断点调试。

2.4.2 真机调试环境准备

真机调试需要一台已解锁Bootloader的Android设备,并安装ADB和Fastboot工具。

步骤 操作内容 验证命令
1 安装ADB和Fastboot sudo apt install -y adb fastboot
2 解锁Bootloader(各品牌方法不同) fastboot oem unlock 或厂商专用工具
3 进入Fastboot模式 adb reboot bootloader
4 烧录自定义内核 fastboot flash boot boot.img
5 重启并验证内核版本 adb shell cat /proc/version

2.4.3 内核调试输出查看

驱动开发过程中,printk 输出的日志是主要调试手段。配置内核参数以查看完整日志:

# 通过ADB设置内核日志级别(显示所有级别)
adb shell "echo 8 > /proc/sys/kernel/printk"

# 实时查看内核日志
adb shell dmesg -w

# 或者使用logcat查看kernel日志(部分设备支持)
adb logcat -b kernel
⚠️ 真机调试风险提示: 烧录自定义内核可能导致设备变砖。务必在烧录前备份原始boot分区:adb shell "dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/boot_backup.img",然后 adb pull /sdcard/boot_backup.img。

2.5 环境验证清单

完成以上所有步骤后,使用以下清单逐项验证环境是否就绪:

  • ✅ 交叉编译工具链:运行 aarch64-linux-android-gcc --version 显示版本信息
  • ✅ 内核源码:ls ~/android-kernel/common/Makefile 存在且包含 VERSION = 5 等定义
  • ✅ 编译能力:执行 make ARCH=arm64 defconfig 无报错
  • ✅ 模拟器启动:QEMU虚拟机能够正常启动并进入shell
  • ✅ 真机连接:adb devices 显示设备序列号且状态为 device
  • ✅ 内核烧录:fastboot devices 识别设备,且能执行 fastboot flash boot