[基础教程]如何编译一个ARM64架构的自定义内核 #950
Replies: 4 comments 5 replies
-
Add step to make flashable kernel zip how to make zip for any device how find boot path , how to change in anykernel setting according to device and how find this change |
Beta Was this translation helpful? Give feedback.
-
Compiling non-gki kernel does not require so much memory and disk capacity, 2+16 is enough. |
Beta Was this translation helpful? Give feedback.
-
I wonder why 'CLANG_TRIPLE=aarch64-linux-gnu-' rather than 'CLANG_TRIPLE=aarch64-linux-android-' Also it seems that Android 14+ can be compiled with pure clang, but why is it still necessary to use the gcc toolchain |
Beta Was this translation helpful? Give feedback.
-
首先是一个简单的自述。我是一个业余的安卓设备玩家,所以这里讲述的东西都是最基本的。经验丰富朋友可以无视。
其次,这个教程我希望能尽量简化,以帮助新手度过试错期。
由于现代安卓设备绝大多是都是ARM64架构,所以这篇指南是针对ARM64设备的。
所以,让我们开始吧.
1.基础准备:
我在这里事先声明,我不会教你如何安装Linux发行版或者怎么安装虚拟机。因为这是个编译内核的教程,而安装操作系统这些是很容易在网上获得教程的。
2.安装基本依赖环境:
我会按照Ubuntu 20.04为例子去告诉你该如何做:
打开你的终端,使用下列命令来安装基本的编译依赖:
如果你的系统缺少这些依赖环境,编译就会报错。当然,上述这些并不一定能100%保证你完全不缺少依赖环境。你需要依照你要编译的内核和系统进行调整。
这里举一个例子,华为早期设备的内核用的是Python 2而不是Python 3。如果你用Python 3就会导致编译出错。
3.为设备选择合适的内核
首先你要了解你设备的安卓版本,安卓内核版本。这样你才能从厂商公布的开源源码内获得正确的那一个。
因为依照谷歌要求,一个设备至少能获得3次安卓大版本更新。
期间厂商可能会修改内核。所以你需要知道这些信息以获取正确的内核。
我用两个设备举例:
设备1:
知道了这些,就可以去小米开源内核的仓库下载合适的内核了。
那么小米开源的页面里就有提示你机型,安卓版本,内核分支之类的信息。
依靠这些你就可以筛选出来合适的内核。
设备2:
知道了这些,就可以去华为开源页面去下载合适的内核了。
华为的开源网站会提示你Model,系统版本等信息,以供你查询正确的型号。
当你知道基本的信息后,就可以下载内核进行编译的准备了。
4.编译准备
首先要选择合适的交叉编译器 。
什么是交叉编译器?参见:Cross compiler
简单讲,你的电脑是x86架构,而你手机是ARM64架构,不同架构的二进制文件是不通用的。需要为对应的平台生成合适的二进制文件。
那么回到选择合适交叉编译器上来。
首先明确一点,目前手机大多是采用Clang编译器去编译的。但是早期一点的手机仍然使用GCC编译器。
所以你需要找到合适的交叉编译器。
然而很不幸,合适的交叉编译器需要你自己寻找。
这里我只说我自己的经验:
可以参考的交叉编译器:
谷歌的GCC交叉编译器:
Google GCC:aarch64-linux-android-4.9
打开此页面你会看到琳琅满目的选择,请按照你的安卓版本搜索,例如:android-q (安卓10)。
谷歌的Clang:
Google Clang:Google Clang linux-x86
打开此页面你会看到琳琅满目的选择,请按照你的安卓版本搜索,例如:android-13 (安卓13)。
常用的第三方交叉编译器推荐:
Proton-Clang
由kdrag0n开发Clang交叉编译器。详情参见项目主页。
The Linaro GCC 4.9-2017.01
Linaro GCC 4.9也是替代谷歌GCC很好的选择。详情参见项目主页。
5.开始编译
在一个合适的空白文件夹内解压你的内核,然后在另一个空白的文件夹内解压你的交叉编译器,最后在源码根目录打开终端。
如果使用GCC:
1.设置环境变量PATH:
XXXXXX是你的就交叉编译器的具体路径的根目录。
这个命令的含义是设置环境变量PATH,而且只在这个终端内有效。
例如我的交叉编译器路径是:
这个命令的含义是声明交叉编译器的名字是aarch64-linux-gnu-,注意这个**-**是必须的。
这个名字的具体名称是根据你下载的交叉编译器决定的。请勿直接照抄。
此命令的含义是声明你要编译的内核架构是ARM64。
这个命令的含义是在 ARM64架构下,使用指定的内核名称(XXXXX)生成一个默认的配置文件,该配置文件包含了编译内核所需的配置信息,如启用或禁用的功能、驱动程序选项等.
defconfig一般位于内核根目录的arch/arm64/configs/内。请选择适合自己设备的defconfig。
O=out: 此参数用于指定构建输出目录的参数。通常,内核编译会将生成的文件放在指定的输出目录中,以保持项目的整洁性。这样你编译出来的内核就会放在内核根目录的/out/arch/arm64/boot/内。一般编译出来的是Image.gz或者Image。gz-dtb。
5. 运行编译:
这个命令用于编译 Linux 内核,并将编译过程中的标准输出和标准错误输出同时输出到一个文件kernel_log.log中。
这样假如你编译错误了,可以在kernel_log.log内查询你的错误,方便你修正错误。
-jX: 这个参数用于指定并行编译的线程数,其中 X 应该替换为一个整数。这允许同时编译多个文件,以加快编译过程。通常,X 的值会设置为计算机上可用的CPU核心数量乘以2,以最大程度地利用系统资源。
例如我的CPU有4个核心,就使用-j8。
接下来只有两种情况,要么编译成功要么失败。
关于错误修正不在本片教程范围内。请自己学习排查。
如果使用Clang:
1.设置环境变量PATH:
XXXXXX是你的就交叉编译器的具体路径的根目录。
这个命令的含义是设置环境变量PATH,而且只在这个终端内有效。
例如我使用的Proton-Clang交叉编译器路径是:
这个命令的含义是声明交叉编译器的名字是aarch64-linux-gnu-,注意这个**-**是必须的。
CC=clang是声明你使用Clang作为编译器。
这个名字的具体名称是根据你下载的交叉编译器决定的。请勿直接照抄。
此命令的含义是声明你要编译的内核架构是ARM64。
这个命令的含义是在 ARM64架构下,使用指定的内核名称(XXXXX)生成一个默认的配置文件,该配置文件包含了编译内核所需的配置信息,如启用或禁用的功能、驱动程序选项等.
defconfig一般位于内核根目录的arch/arm64/configs/内。请选择适合自己设备的defconfig。
O=out: 此参数用于指定构建输出目录的参数。通常,内核编译会将生成的文件放在指定的输出目录中,以保持项目的整洁性。这样你编译出来的内核就会放在内核根目录的/out/arch/arm64/boot/内。一般编译出来的是Image.gz或者Image。gz-dtb。
5. 运行编译:
这个命令用于编译 Linux 内核,并将编译过程中的标准输出和标准错误输出同时输出到一个文件kernel_log.log中。
这样假如你编译错误了,可以在kernel_log.log内查询你的错误,方便你修正错误。
-jX: 这个参数用于指定并行编译的线程数,其中 X 应该替换为一个整数。这允许同时编译多个文件,以加快编译过程。通常,X 的值会设置为计算机上可用的CPU核心数量乘以2,以最大程度地利用系统资源。
例如我的CPU有4个核心,就使用-j8。
接下来只有两种情况,要么编译成功要么失败。
关于错误修正不在本片教程范围内。请自己学习排查。
6.结尾
到这里其实就结束了,内核编译其实就这几条,这是我第一次写通用的教程,诚挚欢迎大家指正和建议。如果有更好的方案请在讨论区留言。如果有语法错误或者描述错误也烦请您指正。
Beta Was this translation helpful? Give feedback.
All reactions