android kernel编译

引言

首先是一个简单的自述。我是一个业余的安卓设备玩家,所以这里讲述的东西都是交流的。经验丰富的朋友可以无视。
其次,这个教程我详细讲一下,以帮助新手度过试错期。


编译Android内核之前需要准备的东西:
1.有一台已经解锁bootloder的手机
2.一个linux环境,虚拟机,wsl,termux等都可以
3.能够认真耐心看教程

紧接着
1.首先确定您的手机代号(中文)
xiaomi可以访问xiaomirom.com来查找您的手机代号
2.从您品牌官方获取开源代码:例如小米的开源地址( https://github.com/ MiCode/Xiaomi_Kernel_OpenSource )
3.如果不想用官方的开源,可以选择第三方开源,比如LineageOS等等
4.如果你的机子既没有官方开源也没有第三方开源,那这个看你可以省点开源。
5.实践最重要!实践最重要!实践最重要!


开始操作!
安装基本操作依赖

1.我会按照Ubuntu为例子去告诉你怎么做:
打开您的终端,使用以下命令来安装基本的依赖项:

1
2
3
4
5
apt-get install -y bc bison build-essential ccache curl flex g++-multilib gcc-multilib git git-lfs gnupg gperf imagemagick
lib32ncurses5-dev lib32readline-dev lib32z1-dev libelf-dev liblz4-tool libncurses5 libncurses5-dev
libsdl1.2-dev libssl-dev libxml2 libxml2-utils lzop pngcrush rsync
schedtool squashfs-tools xsltproc
zip zlib1g-dev

如果你的系统缺少这些依赖环境,就会报错。
当然,上述这些并不一定能100%保证你完全不缺少依赖环境。你需要继续升级的内核和系统进行调整。

2.编译准备
首先要选择合适的交叉编译器:
小米大部分交叉编译器都兼容
华为:在不修改源码的情况下,仅兼容谷歌GCC。
一加:大部分交叉编译器都兼容

这里列举几个编译器:
Google的GCC交叉编译器:
Google GCC: aarch64-linux-android-4.9
打开此页面你会看到琳琅满目目的选择,
请按照你的安卓版本搜索,例如:android-t (安卓13)。

谷歌的Clang:Google Clang

打开此页面你会看到琳满目的选择,请按照你的Android版本搜索,例如:android-13 (Android13)。

常用的第三方交叉编译器推荐: Proton-Clang
由kdrag0n开发Clang交叉编译器。详情参见项目主页。

⚠⚠⚠:
较新版本的内核靠clang可以编译,基本不需要GCC
老版本的内核需要GCC或者clang+GCC,具体需要哪个编译器哪个版本,还得根据你自己的内核而定


3.拉取源及其工具链
1.拉取源码:
例如拉取LineageOS的内核源码:

1
2
3

git clone https://github.com/LineageOS/android_kernel_xiaomi_sm8550.git --depth=1

2.拉取源码后先去你的内核根目录/arch/arm64(根据你的设备架构来定)/config或者/config/vendor里找到你的配置文件(一般来说是:机箱代号_defconfig)
比如说:我在一个目录下创建了一个kernel文件夹,把在kernel文件夹中取了源码并命名xxx,那外围配置文件在kernel/xxx/arch/arm64/config中或者在kernel/xxx/ arch/arm64/config/vendor中

3.如果里面没有config文件,那么你就需要从你的官方boot里面解压出来了,先下载或者从你的设备上解压出来,上传到Linux里面环境,cd到内核源码里面,执行scripts/extract-ikconfig工具提取配置信息。

1
2
3
4
5
6
7

cd 你的内核源码路径
./scripts/extract-ikconfig 你的boot分区文件路径 >> device_config
cp device_config arch/你的设备cpu架构/configs/你的设备代号_config
#或者这样
cp device_config arch/你的cpu架构/configs/temp device_config
#取一个临时的名称

4.开始编译
cd到你的内核源码路径

如果使用GCC:
1.设置环境变量PATH:

exprot PATH="/XXXXXX/bin:$PATH"

XXXXXX是你的就交叉编译器的具体路径的根目录。
这个命令的含义是设置环境变量PATH,并且只在这个语句内有效。
例如我的交叉编译器路径是:
export PATH=“/home/ubuntu/gcc_4.9/bin:$PATH”

2.声明你要编译的内核架构:

export ARCH=arm64

export SUBARCH=arm64

3.声明交叉编译器的:
export CROSS_COMPILE=aarch64-linux-gnu-
该命令的含义是声明交叉编译器的名称是aarch64-linux-gnu-,
注意名称-是必须的。
这个名称的具体名称是根据您下载的交叉器编译器决定的。请勿直接照抄。

4.声明你要编译内核的defconfig:
make ARCH=arm64 O=out XXXXX_defconfig
这个的含义是在ARM64架构下,使用指定的内核名称(XXXXX)生成一个默认的配置文件,该配置文件包含了编译内核所需的配置信息,如启用或禁用的功能、驱动程序选项等。

O=out:此参数用于指定构建输出目录的参数。通常情况下,内核编译生成的文件放在指定的输出目录中,以保持项目的整洁性。

这样你出来编译的内核就可以放在内核中根目录的/out/arch/arm64/boot/内。一般编译出来的是Image.gz或者Image。gz-dtb。


5.运行编译
make ARCH=arm64 O=out -jX 2>&1 | tee kernel_log.log
这个命令,用于编译Linux内核,把编译过程中的标准输出和标准错误输出同时输出到一个文件kernel_log.log中。
这样假设你可以编译错误了,在kernel_log.log内查询你的错误,方便你修改错误。
-jX:这个参数用于指定硬件编译的线程数,其中 X 应该替换为一个整数。这允许同时编译多个文件,以加快编译过程。通常,X 的值会设置为计算机上可用的CPU核心数量乘以2,以最大程度利用系统资源。
例如我的CPU有4个核心,就使用-j8。


6.等待编译中结果
路径报错,需要您根据报错内容去解决错误,
一般编译产物正在编译内核目录/out/arch/您的设备架构/boot中

如果使用Clang:
1.设置环境变量PATH
export PATH=”/XXXXXX/bin:$PATH"
XXXXXX是你的就交叉编译器的具体路径的根目录。
这个命令的含义是设置环境变量PATH,并且只在这个语句内有效。
例如我的clang路径:
export PATH=“/home/ubuntu/kernel/clang/bin:$PATH"

2.声明你要编译的内核架构:
export ARCH=armm64
export SUBARCH=arm64

3.为了防止环境配置错误以及后续省事简便,可以通过脚本来配置环境:
在你的内核根目录中创建一个自定义命名,sh
例如:touch build.sh

脚本内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#!/bin/bash
args="-j$(nproc --all) \ #-j$(nproc --all )这里是说用当年环境下最高的cpu线程进行编译
ARCH=arm64 \
SUBARCH=arm64 \
O=out \ #输出路径是在当前位置的out文件夹
CC=clang \ #指定C语言文件编译器为clang
CROSS_COMPILE=aarch64-linux-android- \ #配置交叉编译的目标平台为arm64
CROSS_COMPILE_ARM32=arm-linux-androideabi- \ #配置32位交叉编译器(如果是gki内核,请删除这句)
CLANG_TRIPLE=aarch64-linux-gnu- " #负责交叉编译的Linux编译器
#这个也不清楚干嘛用的,就是它在构建的时候,需要用到Linux的一些标准库内容
#但是安卓的编译器阉割了,直接用安卓的编译,会出现很多莫名其妙的错误,所以就需要再配置一下这个编译器了
#如果你的设备是32位的,这里也要修改的
#最后三个的具体名称是根据你下载的交叉编译器决定的。请勿直接照抄。
#先检测配置文件有没有问题并进行初次构建
make ${args} xxx_defconfig
#这里如果不加vendor,就会读取
#内核源码/arch/你的设备架构/configs/里面的配置文件
#这个完整路径为: 内核源码/arch/你的设备架构/configs/vendor/lineageos_pstar_defconfig
#不加vendor的完整路径为:内核源码/arch/你的设备架构/configs/lineageos_pstar_defconfig

#这里的args就是上面设置的临时变量args里面的内容
#开始构建内核
make ${args}

编写完整脚本,保存,并在内核根目录执行如下代码:

chmod +x build.sh
./build.sh #开始编译
如果后续编译出错而中途停止,重新编译前要进行如下步骤:

#清理之前构建的残留内容
make clean && make mrproper
#删除out文件夹,否则之前指定输出的文件夹
rm -rf out
#重新执行
./build.sh


5.内核打包
编译内核完成后,预算方式有很多种,其中一种就是使用AnyKernel3:
https://github.com/osm0sis/AnyKernel3
来进行预算刷入


6.尾声
构建内核中如果出现一些报错,你应该去GitHub里面搜索,而不是用百度
到这里其实就结束了,内核编译其实就这几条,这是我第一次写通用的教程,诚挚欢迎大家指正和建议。如果有更好的方案请在讨论区留言。如果有语法错误或者描述错误也烦请您指正。另外,随着时代的更新,可能会有更好的方法,所以请大家灵活运用。


android kernel编译
https://yblog.15937.top/2025/10/10/android-kernel编译/
作者
㪾夜
发布于
2025年10月10日
许可协议