第一章:AOSP内核开发环境搭建
各位同学,咱们直接进入正题。做AOSP内核驱动移植,第一步就是把开发环境搭好。这一步要是没弄利索,后面全是坑。我见过太多人卡在环境配置上,一卡就是好几天。
说白了,环境搭建就四件事:Ubuntu系统配置、AOSP源码下载、内核源码结构分析、交叉编译工具链配置。咱们一个一个来。
1.1 Ubuntu系统配置
我个人习惯用Ubuntu 20.04 LTS,64位版本。为什么选它?因为AOSP官方推荐的就是这个版本,兼容性最好。你非要用22.04也行,但有些依赖包可能会出问题,到时候还得自己折腾。
装好系统后,第一件事就是安装必要的依赖包。直接上命令:
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/ 下的文件,其他目录基本不动。
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)
好了,环境搭建这部分就讲到这里。下一章咱们开始真正动手,写第一个内核驱动模块。到时候你会觉得,前面这些准备工作都是值得的。
记住一句话:环境搭得好,编译没烦恼。别嫌麻烦,一步到位比反复折腾要省时间得多。