修改Android kernel(内核)可以开启一些隐藏的功能,也意味着要从头编译kernel,要懂一
点C语言。
先从简单的开始: 刷入自己修改过的kernel后,会在手机核心版本显示自己的名字。
https://i.imgur.com/p1ztOFH.png
网志好读版: https://bit.ly/3yWRh7Y
## 一、硬件要求
要刷kernel,手机必定已经解锁。刷kernel不会重置手机资料,所以刷之前只要备份boot分
区,避免卡开机。
.手机: 红米Note 5 (whyred),系统为LineageOS 18。
.电脑: Intel Core 2 Q9550 + 4GB DDR2 RAM,作业系统: Lubuntu 20.04。
## 二、步骤概述
编译kernel包含除错可能会花至少一天的时间。
下载kernel原始码 → 下载交叉编译器 → 简单加上名字后第一次编译 → 刷入手机看功能
正不正常 → menuconfig修改kernel → 重新编译 → 刷入到手机
我们会在Linux电脑桌面建立一个叫做`customkernel`的目录当作工作目录。在第五步开始
编译前里面大概长这样:
https://i.imgur.com/F6NVAC9.jpg
接着安装以下套件
```
sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g
-dev \
gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev \
x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev \
libxml2-utils xsltproc unzip bc
```
## 三、取得kernel原始码
原厂的kernel或第三方kernel都可以,通常会把原始码放在Github。
我选择有额外功能的"RAD Kernel"专案,这个专案程式码问题比较少。
1. 到他们的Github,使用指令clone原始码
```bash
git clone https://github.com/radcolor/android_kernel_xiaomi_whyred.git
```
2. 为了方便识别,将clone下来的目录重新命名为"src"。
## 四、下载交叉编译器
1. 使用EVA GCC编译。到[XDA](https://bit.ly/3sDj4sP)下载ARM与ARM64的版本(点选dire
ct download下载)
2. 将下载的arm版本解压缩,命名为tc32。
3. aarch64解压缩,命名为tc。
4. 将这二个目录移动到customkernel,到目前为止目录长这样,src是kerenl原始码的目录
,tc和tc32则是刚刚下载的交叉编译器。
https://i.imgur.com/F6NVAC9.jpg
## 五、第一次测试编译
1. 进入src的目录,在这里开启终端机。先export环境变量:
```
#以下分别对应tc和tc32所在的目录,以及档案名称前缀
export CROSS_COMPILE=/home/ivon/Desktop/customkernel/tc/bin/aarch64-elf-
export CROSS_COMPILE_ARM32=/home/ivon/Desktop/customkernel/tc32/bin/arm-eabi-
export ARCH=arm64
```
2. 按照`机型_config`档案产生设定,该档案通常在`arch/arm64/configs`。
```
make whyred_defconfig
#输出: configuration written to .config
```
3. 开启src目录的`MakeFile`,在`EXTRAVERSION`后面加入自己名字的字串:
https://i.imgur.com/Xziza5e.jpg
4. 接着开始编译kernel
```bash
make
```
5. 这台电脑编译至少要20分钟,若遇到error编译器就会停下来,要去改程式码再重新make
,编译器会从上个中止的地方继续。关于常见错误,参考这篇: [编译Android kernel遇到
的error纪录](https://bit.ly/3muc1yY)
https://i.imgur.com/ZtBgwje.jpg
6. 编译好的档案位于`arch/arm64/boot/`,应该会有一个`Image.gz-dtb`的档案。
https://i.imgur.com/FPeyYaQ.jpg
7. 接着要重新打包boot.img,把原厂的boot.img解开之后把我们做的kernel塞进去。到[XD
A](https://bit.ly/3proFAr)下载Linux版AIK (点选文中的AIK-Linux-v3.8-ALL.tar.gz附
件),解压缩。
8. 手机进入TWRP → Advanced → Terminal,使用dd指令从手机提取原厂的boot.img。
```
dd if=/dev/block/bootdevice/by-name/boot of=/sdcard/stockboot.img
```
9. 把这个原厂的`stockboot.img`档案传输到电脑,放到AIK的工作目录,并将刚刚编译的`
Image.gz-dtb`也放到这个目录。
https://i.imgur.com/qR8rDbw.jpg
10. 在AIK目录开启终端机,使用指令解开stockboot.img(需要sudo)
```
./unpackimg.sh stockboot.img
```
11. 进入目录`split_img`,把`stockboot.img-kernel`档案替换成我们编译好的Image.gz-
dtb(档名要改成stockboot.img-kernel)。
12. 回到AIK目录,重新打包,应该会得到一个`image-new.img`的档案。
```
./repackimg.sh
```
https://i.imgur.com/OXKMpKS.jpg
## 六、刷入到手机
将新的`image-new.img`传输到手机,用TWRP点选Install Image,刷入到boot分区。
接着就是看看能不能开机了...若卡开机,还原TWRP的boot分区备份,继续在电脑上debug吧
...
## 七、menuconfig开关kernel功能
如果前六个步骤成功完成,那就来真正修改kernel吧。
1. 在src目录开启终端机,输入指令开启kconfig选单,用于开关kernel的功能。
```
make menuconfig
```
2. 使用键盘上下和Enter进入子选项。找到要开启的项目按下`y`,然后用键盘左右键移动
到`Save`储存设定值。
https://i.imgur.com/6Dng78e.jpg
3. 改好后切换到`Exit`退出,写入变更,再次开始编译kernel:
```
make
```
4. 接着重复第五步的步骤,编译成功后把kernel打包,刷到手机测试。
心得:
编译kernel不用花大把时间下载原始码,只要挑到状况比较好的专案,编译时遇到的问题就
会少很多。