[心得] 编译修改Android Kernel

楼主: ivon852 (ASUS)   2021-12-26 14:59:04
修改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不用花大把时间下载原始码,只要挑到状况比较好的专案,编译时遇到的问题就
会少很多。
作者: bingo77786 (BINGO)   2021-12-26 15:22:00
看不懂先推
作者: speed7022 (Speed7022)   2021-12-26 15:45:00
认真玩手机,推
作者: pmes9866 (没见过帅哥喔)   2021-12-26 15:52:00
原厂没有开源kernel是不是就不能修改了前阵子看到1+9开发人员在骂1+不开源kernel应该说XDA上的第三方开发人员
作者: ta497636   2021-12-26 16:14:00
推。看不懂的我先存留后详读。
作者: Nigger5566 (尼哥56)   2021-12-26 16:21:00
可以刷首抽吗
作者: ShibaTatsuya (司波达也)   2021-12-26 16:39:00
先推再说
作者: athraugh (athraugh)   2021-12-26 16:43:00
看不懂, 先推一下
作者: oppoR20 (R20)   2021-12-26 16:56:00
够hardcore 给推1+不是对开发者很友好?会有不给kernel source code的问题吗
作者: abc0922001 (中士abc)   2021-12-26 16:58:00
所以没开源的只能用原厂的 boot.img1+9 不是内核不更新才被骂的吗
作者: brli7848 (无理阿?)   2021-12-26 17:07:00
隔壁有AndroidDev...
作者: starskyjth (starskyjth)   2021-12-26 17:28:00
所以你到底哪里用到C语言??
作者: school4303 (某爬虫类)   2021-12-26 17:45:00
楼上一说我才发现 整篇哪里有用到C?
作者: Fm4n (钱不是万能的,是万代的)   2021-12-26 18:05:00
文章其实可以转到AndroidDev......
作者: nigue (nigue)   2021-12-26 18:15:00
你修改了什么C语言内容?
作者: brli7848 (无理阿?)   2021-12-26 18:16:00
而且telnet BBS又不吃md语法…到底…
作者: nimiq5566 ((∩_∩))   2021-12-26 19:08:00
kernel理论上一定要开源,授权的规范是这样
作者: ruizachi (zachi)   2021-12-26 19:23:00
干货太多了吧
作者: gbls9527341 (孤不离三衷)   2021-12-26 19:35:00
不懂 但还是推
作者: Arbin (路人_Lv菜逼八)   2021-12-26 20:06:00
敢不开源,在美国混的话会先吃GPL v2的法律问题吧然后这边要说的是,原PO这比较像是敲门砖,其他的东西其实要改很吃经验和背景知识,每只手机的状况也不尽相同
作者: qscgy4 (有点厉害)   2021-12-26 20:26:00
刷了以后可以干嘛?
作者: romber (tako)   2021-12-26 20:36:00
推,md本来就是设计为纯文字也能方便读写的标记语言,用md不觉得有什么问题
作者: ededws1 (ATMJin)   2021-12-26 20:56:00
用md在纯文字接口下真的没什么问题几个#或```不会太影响阅读
作者: Taichun318 (淡蓝色的双鱼)   2021-12-26 21:14:00
作者: abc0922001 (中士abc)   2021-12-26 21:32:00
原厂的内核有时候没有第三方的大神写的好毕竟领钱办事的跟基于爱好的,结果还是有点不同
作者: abc127845 (monkeyGOD)   2021-12-26 21:38:00
BSP的来推个~Build code蛮花时间的 还有电脑速度有差
作者: Cireiat (Cire)   2021-12-26 21:53:00
谢啦,等到了,一直想在Android上面开docker,过年有空有玩具了
作者: mdk3500 (马拉湾岸黑鸟)   2021-12-26 22:20:00
阿贺野级真香
作者: ja881213 (Theodore039)   2021-12-26 22:30:00
有些第三方开放了很多功能,真的蛮实用的
作者: kyocartoon (Kyo)   2021-12-26 22:53:00
作者: oppoR20 (R20)   2021-12-26 23:51:00
以前android 2.x的时代刷内核是常有的事情 以前xperia x8要刷naa内核才有多点触控
作者: ben79968 (学测战士)   2021-12-27 00:12:00
居然还在用Q9550
作者: whhw (人有羞耻马无所谓)   2021-12-27 00:34:00
嗯嗯原来如此
作者: ZnOnZ (最亮的星)   2021-12-27 00:47:00
推推
作者: zouken (Moai)   2021-12-27 01:58:00
推推
作者: yoyo178134 (安安尼玛)   2021-12-27 02:18:00
应该要加个syscall来玩一下 单纯build没意思改名字不能叫修改kernel吧
作者: higger (朝乡而行2016)   2021-12-27 08:04:00
我从来都不知道内核和Rom有什么关连...
作者: avans (阿纬)   2021-12-27 08:14:00
作者: lpoijk (↗ 老 爷 ↙)   2021-12-27 09:49:00
现在都gki了 自己build是为了?
作者: dreamgirl (嘉嘉)   2021-12-27 09:56:00
恭喜你可以开发鸿蒙3.0啦(误
作者: joejoe14758 (KILE)   2021-12-27 10:27:00
感觉这边不写程式的居多 所以要玩这个建议拿不要的手机来玩 不然怎么死的都不知道
作者: paul40807 (ㄏㄏ弟)   2021-12-27 11:13:00
好怀念那个时候为了让手机功能丰富 或是为了新UI在那边刷啊 现在手机功能足了 又多了银行支付等等的功能 已经没有动力修修改改了
作者: jim543000 (玄黄无极)   2021-12-27 11:30:00
这篇在干嘛...?
作者: DarenR (DarenR)   2021-12-27 12:24:00
跟我想的一样 给推
作者: a2334436 (<lol>)   2021-12-27 12:38:00
先推
作者: ifconfig5566 (it56)   2021-12-27 13:14:00
动机...?
作者: acn88205 (叹)   2021-12-27 14:36:00
不懂 但感觉很屌 推
作者: aaz957658 (Ruby)   2021-12-27 15:50:00
懂C不代表会用到C
作者: shinkiro (Shinkiro)   2021-12-27 18:28:00
先推再说
作者: joe820730 (Let it go)   2021-12-27 19:21:00
Hardcore推,上次这样玩大概已经是小米2S那个时期了,现在已经没那个时间这样玩了
作者: Tahuiyuan (mata)   2021-12-28 00:41:00
推技术
作者: deffejfr (莫再提)   2021-12-28 14:02:00
作者: eric525498 (艾瑞克 我肆酒吧)   2020-01-01 17:28:00
推 hard core

Links booklink

Contact Us: admin [ a t ] ucptt.com