下载
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/kernel/manifest -b common-android13-5.15
cd common-android13-5.15
编译
BUILD_CONFIG=common-modules/virtual-device/build.config.virtual_device.aarch64 build/build.sh
我们来详细讲解如何下载和编译适用于 Android 13 的 Linux 内核,版本为 common-android13-5.15。
这个过程主要分为几个步骤:搭建编译环境、获取源代码、配置内核、编译内核。我们将以在 Ubuntu 22.04 LTS 系统上编译为例。
第一步:搭建编译环境
首先,你需要安装必要的依赖包和工具链。
安装基本依赖包:
bash
sudo apt update
sudo apt install -y git-core gnupg flex bison build-essential zip curl zlib1g-dev
libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev
lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3
git make gcc g++ libssl-dev bc rsync ccache
安装特定版本的 Clang 编译器 (推荐):
Android 内核编译强烈推荐使用 Google 预构建的 Clang 编译器,而不是 GCC。我们会从 AOSP 的预构建仓库中获取它。在下一步下载源代码时,它会自动包含在 prebuilts/ 目录中。我们稍后会设置路径。
安装 Repo 工具:
repo 是 Google 开发的一个用于管理多个 Git 仓库的工具,Android 内核开发依赖它。
bash
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
将 ~/bin 添加到你的 PATH 环境变量中。将下面这行添加到你的 ~/.bashrc 或 ~/.zshrc 文件末尾:
bash
export PATH=~/bin:$PATH
然后执行 source ~/.bashrc 使其生效。
第二步:获取内核源代码
Google 为不同的 Android 设备和平台维护了多个内核仓库。common-android13-5.15 是一个"通用"内核,用于模拟器或作为其他设备的起点。
创建一个工作目录并初始化 Repo 清单:
bash
mkdir android-kernel && cd android-kernel
初始化 Repo,指定分支(-b)。
重要: 你需要指定正确的清单分支。对于 common-android13-5.15,通常使用 android13-5.15 分支。
清单仓库是 https://android.googlesource.com/kernel/manifest。
bash
repo init -u https://android.googlesource.com/kernel/manifest -b android13-5.15
这条命令会初始化 Repo,并下载当前清单(default.xml),它描述了所有需要下载的子项目(Git 仓库)。
同步源代码:
这一步会根据 manifest.xml 文件下载所有的内核源代码和预编译工具链。这是一个非常耗时的过程,取决于你的网速。
bash
repo sync -j$(nproc) # -j 使用你CPU核心数来并行下载,加快速度
同步完成后,你的 android-kernel 目录下会出现多个子目录,如 common/(通用内核代码)、prebuilts/(预构建的编译器)等。
进入内核目录:
common-android13-5.15 的源代码位于 common/ 目录。
bash
cd common
第三步:配置和编译内核
现在源代码已经就绪,我们需要配置内核并启动编译过程。
设置环境变量(构建配置):
你需要告诉构建系统要编译什么架构以及使用哪个配置。对于在 x86 主机上为 ARM 设备(或模拟器)编译,我们需要交叉编译。
ARCH: 目标架构(例如 arm64, x86_64)
CROSS_COMPILE: 交叉编译工具链的前缀
CLANG_TRIPLE: Clang 工具链的目标三元组
LLVM: 指向 Clang 编译器的路径
Google 提供了脚本来设置这些复杂的环境变量。最可靠的方法是使用他们提供的 build.config 文件。
对于 common 内核,通常有一个预定义的构建配置。你可以使用 build.sh 脚本。
使用 build.sh 脚本编译(推荐方法):
这是 Google 官方推荐的方法,它会自动处理所有的环境变量和配置。
bash
# 在 common/ 目录下执行
BUILD_CONFIG=common-modules/virtual-device/build.config.gki.x86_64 build/build.sh
BUILD_CONFIG: 这个环境变量指定了使用哪个构建配置文件。这里我们选择为"虚拟设备"(如模拟器)编译一个 x86_64 架构的 GKI(通用内核映像)内核。
build/build.sh: 这是 Google 提供的主要构建脚本。
其他常见的 BUILD_CONFIG 例子:
为 ARM64 设备编译:BUILD_CONFIG=common-modules/virtual-device/build.config.gki.aarch64
为 Pixel 设备编译会有特定的配置文件(如 build.config.floral)。
等待编译完成:
编译过程会需要一些时间。如果成功,你会在终端看到类似 Kernel build successful 的消息。
第四步:找到编译产物
编译成功后,输出文件(内核映像、模块等)位于 out/ 目录下,具体路径由 BUILD_CONFIG 决定。
对于上面的 x86_64 例子,路径通常是:
bash
ls -la out/android13-5.15/common-modules/virtual-device/dist/
在这个 dist/ 目录下,你应该能找到最重要的文件:
kernel-5.15-xxx: 压缩的内核映像文件(例如 bzImage 用于 x86)
System.map-5.15-xxx: 内核符号映射文件
多个 *.ko 文件:内核模块
常见问题与疑难解答
repo init 或 repo sync 失败:
网络问题: 由于网络原因,访问 android.googlesource.com 可能会不稳定。可以尝试使用代理或更换网络环境。
镜像源: 清华大学提供了 AOSP 的镜像源,但内核仓库可能需要单独配置,有时不如直接访问官方源稳定。
编译失败:
依赖缺失: 最常见的原因是第一步的依赖包没有安装完全。仔细检查错误信息,它通常会提示缺少哪个库或工具。
Python 版本: 确保你的系统默认 python 是 python3。可以通过 sudo update-alternatives --config python 来设置。
Clang 版本: 确保使用的是 prebuilts/ 目录下的 Clang,而不是系统自带的。build.sh 脚本会自动处理这一点。
内存不足: 编译内核需要大量内存。如果内存不足,可以减少编译并行任务数,使用 make -j2 而不是 -j$(nproc)(但使用 build.sh 时不需要手动指定)。
如何清理编译结果?
bash
# 在 common/ 目录下
build/build.sh clean
# 或者手动删除 out/ 目录
rm -rf out/
总结
整个过程的核心步骤是:
准备环境:安装所有必要的软件包。
获取代码:使用 repo 工具同步 android13-5.15 分支的源代码。
执行编译:在 common/ 目录下,使用 BUILD_CONFIG=... build/build.sh 命令来触发自动化编译流程。
对于为真实设备(如 Pixel 7)编译内核,过程会更为复杂,需要获取该设备特定的内核配置和可能需要的专有驱动程序blob。但为模拟器或学习目的,上述 common-android13-5.15 的流程是完全足够的。