第一章:AOSP内核开发环境搭建

各位同学,咱们直接进入正题。做AOSP内核驱动移植,第一步就是把开发环境搭好。这一步要是没弄利索,后面全是坑。我见过太多人卡在环境配置上,一卡就是好几天。

说白了,环境搭建就四件事:Ubuntu系统配置、AOSP源码下载、内核源码结构分析、交叉编译工具链配置。咱们一个一个来。

1.1 Ubuntu系统配置

我个人习惯用Ubuntu 20.04 LTS,64位版本。为什么选它?因为AOSP官方推荐的就是这个版本,兼容性最好。你非要用22.04也行,但有些依赖包可能会出问题,到时候还得自己折腾。

注意:千万别用虚拟机跑32位系统。AOSP源码编译需要大量内存,我建议至少16GB RAM,硬盘留出200GB以上空间。SSD是必须的,机械硬盘编译一次够你喝三杯咖啡。

装好系统后,第一件事就是安装必要的依赖包。直接上命令:

sudo apt-get update
sudo apt-get 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

嗯,这里要注意。有些同学会漏掉 libncurses5-dev,结果编译内核时菜单配置界面打不开。我曾经因为这个折腾了半小时,后来发现就是少装了一个包。

另外,Python环境也得配好。AOSP编译脚本依赖Python 3,但有些工具还是用Python 2。我建议两个版本都装上:

sudo apt-get install -y python3 python3-pip python2

1.2 AOSP源码下载

源码下载是重头戏。AOSP代码量巨大,完整下载一次可能要几十GB。你想想看,光内核代码就几万个文件,再加上Android框架、应用层代码,总量轻松超过50GB。

我推荐用 repo 工具来管理。先安装它:

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

然后创建一个工作目录,初始化仓库:

mkdir aosp
cd aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41

这里我选的是Android 13的稳定分支。为什么选这个?因为13的内核版本是5.15 LTS,驱动移植兼容性比较好。你如果做新项目,建议也选LTS版本的内核。

小技巧:下载时加上 -j4 参数可以并行下载,速度能快不少。但别开太多线程,容易被服务器限流。我一般用 repo sync -j4

下载过程很漫长,少则两三个小时,多则半天。这时候你可以去喝杯咖啡,或者看看内核文档。我第一次下载时盯着进度条看了半小时,后来发现完全没必要——让它后台跑着就行。

1.3 内核源码结构分析

下载完成后,咱们来看看内核源码长什么样。AOSP的内核代码在 kernel/ 目录下,结构大概是这样的:

kernel/
├── common/          # 通用内核代码
├── configs/         # 内核配置文件
├── device/          # 设备相关代码
├── kernel/          # 核心内核代码
├── lib/             # 库文件
├── scripts/         # 编译脚本
└── tools/           # 工具链

这里我要重点说一下 common/ 目录。它包含了所有架构通用的代码,比如进程调度、内存管理、文件系统这些。而 device/ 目录才是我们做驱动移植的主战场。

举个例子,如果你要给某款手机移植驱动,代码通常会放在:

kernel/device/vendor/你的设备名/

这种分层设计其实很合理。通用代码不用动,你只需要关注设备相关的部分。我在做项目时,经常只修改 device/arch/arm64/ 下的文件,其他目录基本不动。

核心要点:内核源码虽然庞大,但咱们做驱动移植,重点关注的是设备树文件(.dts)、Kconfig配置、Makefile以及驱动源码文件。其他部分了解即可,不用深究。

1.4 交叉编译工具链配置

交叉编译,说白了就是在PC上编译出能在ARM设备上运行的代码。你想想看,手机芯片是ARM架构的,但你的开发机是x86架构的,不用交叉编译根本跑不起来。

AOSP自带了一套交叉编译工具链,位置在 prebuilts/gcc/linux-x86/aarch64/ 下。但我个人建议用Clang,因为Google从Android 12开始就全面转向Clang了。

配置环境变量:

export PATH=$PATH:~/aosp/prebuilts/clang/host/linux-x86/clang-r450784e/bin
export PATH=$PATH:~/aosp/prebuilts/gcc/linux-x86/aarch64/aarch64-linux-android-4.9/bin
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-android-
export CC=clang
export CLANG_TRIPLE=aarch64-linux-gnu-

这里有个坑,我必须要提醒你。很多新手会忘记设置 CLANG_TRIPLE,结果编译出来的内核在设备上跑不起来。我曾经排查了整整一天,最后发现就是少了这个环境变量。

验证工具链是否配置成功:

aarch64-linux-android-gcc --version
clang --version

如果能看到版本信息,说明配置成功了。接下来就可以尝试编译内核了:

cd kernel/common
make defconfig
make -j$(nproc)
警告:第一次编译可能会报错,别慌。大多数情况下是缺少某些依赖包,或者环境变量没配对。仔细看错误信息,Google一下基本都能解决。我刚开始做的时候,编译失败十几次才成功,这很正常。

好了,环境搭建这部分就讲到这里。下一章咱们开始真正动手,写第一个内核驱动模块。到时候你会觉得,前面这些准备工作都是值得的。

记住一句话:环境搭得好,编译没烦恼。别嫌麻烦,一步到位比反复折腾要省时间得多。