一、前言
在Non-gki内核中添加KernelSU的前提得是编译好的内核能够正常开机(废话+1),所以本文也将会详细介绍安卓内核的编译过程以及在编译过程中可能遇到的情况.
写这个文章不是因为我技术有多好,只是因为我刚开始搞这个跟个**一样找不到路,所以现在稍微明白点了就写下来给想搞这个的看看,也是为了防止我自己以后忘了。。奶子不大好使记不住东西
如果你只是想编译内核而不是使用kernelsu,你可以忽略本文中拉取kernelsu和修改内核配置的部分
1. 环境要求
一台Linux设备(虚拟机,Docker,WSL,甚至是手机上的Terumx都是可以的),我这里以WSL2,Ubuntu 22.04.2 LTS为例
一部可以正常使用的安卓手机(废话+2)
可以让你连接到github和google的方法(你懂的§( ̄▽ ̄)§)
最后再带上你聪明的小脑袋瓜,粗发!
2. 准备工作
- 首先需要下载所需要的依赖,跟坨屎一样多,直接复制执行就好
sudo apt-get install git ccache automake flex lzop bison gperf build-essential zip curl zlib1g-dev g++-multilib libxml2-utils bzip2 libbz2-dev libbz2-1.0 libghc-bzlib-dev squashfs-tools pngcrush schedtool dpkg-dev liblz4-tool make optipng maven libssl-dev pwgen libswitch-perl policycoreutils minicom libxml-sax-base-perl libxml-simple-perl bc libc6-dev-i386 lib32ncurses5-dev libx11-dev lib32z-dev
- 下载适合自己手机的内核build
这个东西需要自己去Github找,一般为(android)_kernel_<手机厂商>_<cpu代号>
# 以一加8T为例,高通骁龙865代号为sm8250,那么内核仓库名就可能是
android_kernel_oneplus_sm8250
kernel_oneplus_sm8250
我这里的例子是Handelinkernel-v2.6,我在氢的时候最喜欢的一个内核(同时也是最喜欢的一个版本)
# 仓库地址
https://git.drg.fi/drgreen/android_kernel_oneplus_sm8250.git
- 下载所需的交叉编译器
由于这个内核自带了编译脚本,所以我们就根据脚本里的的clang版本下载(至于编译脚本我后面再说)
当然,其实我更推荐第三方的 c l a n g ,因为比较省事 \textcolor{red}{当然,其实我更推荐第三方的clang,因为比较省事} 当然,其实我更推荐第三方的clang,因为比较省事比如:ZyC clang、proton-clang,或者**clang-build-catalogue**
使用方法也都差不多,当然你也可以使用谷歌官方的clang不过第三方有的更省事直接用就完事了
# 以我为例,我把它们分别放在了
~/android/clang-r407598b
~/android/toolchain
二、拉取资源
-
拉取内核源码
# cd到用户文件夹 cd ~ # 拉取内核,有的内核还有submodules,所以直接加上--recurse-submodules git clone --recurse-submodules https://git.drg.fi/drgreen/android_kernel_oneplus_sm8250.git
-
拉取交叉编译工具
a o s p − c l a n g 和第三方 c l a n g 选其中一个就好 \textcolor{red}{aosp-clang和第三方clang选其中一个就好} aosp−clang和第三方clang选其中一个就好
# aosp-clang # 新建文件夹让后直接curl mkdir ~/android cd ~/android curl <需要拉取的clang连接> # 具体版本在这找 # https://android.googlesource.com/platform/prebuilts/clang/host/linux-x86/+/refs/heads/main
按这个图片找对应版本
找到需要的版本后看下图
# 第三方clang(以Zyclang举例),在github仓库的release
# 复制链接直接在当前用户目录下curl
mkdir ~/android
cd ~/android
# 记得选择对应版本
curl <下图获取的连接>
-
拉取kernelsu
cd ~/<内核文件夹> # 在内核文件夹的根目录执行以下命令 curl -LSs "https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh" | bash -
三、修改配置
-
修改配置文件
cd ~/android_kernel_oneplus_sm8250/arch/arm64/configs # 此时你所需要的配置文件可能在./defconfig # 但大概率可能会在./vendor/<配置文件> # 以本内核为例 vi /vendor/kona-perf_defconfig # 在配置文件最底下加上 CONFIG_KPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_KPROBE_EVENTS=y
四、编译内核
# 进去内核的根目录
cd ~/android_kernel_oneplus_sm8250
# 新建一个shell文件
vim ./build.sh
# 输入以下内容
# shell开始
#!/bin/bash
export ARCH=arm64
export SUBARCH=arm64
args="-j$(nproc --all) \
O=out \
CC=clang \
ARCH=arm64 \
LD=ld.lld \
LLVM=1 \
LLVM_IAS=1 \
CROSS_COMPILE=aarch64-linux-gnu- \
CROSS_COMPILE_COMPAT=arm-linux-gnueabi- "
export PATH="$HOME/<clang文件夹路径>/bin:$PATH"
make ${args} vendor/kona-perf_defconfig
make ${args}
# shell结束
# 保存后退出,给shell执行权限
chmod a+x ./buids.sh
# 执行,用source方便报错后调试
source ./build.sh
五、试验
如果你足够幸运的话,那么你现在已经成功一半了
去内核文件夹的out/arch/arm64/boot/文件夹看看你的成果
把Image.*放入anykernel中然后压缩刷入(不同内核压缩方式不同)比如:Image.gz
六、恭喜你,看来你并不是幸运儿
如果你此时将内核刷入后发现各种问题,比如黑屏,重启,高通崩溃(甚至你的out路径里根本就没有出现镜像文件),又或者你编译时报错,所以我将会继续为你排忧解难
-
如果你刷入内核后手机不能正常启动,你可以需要按照术哥(kernelsu的作者,就是那只皮卡丘)的办法,放弃使用kprobe集成的办法,转去修改那么几个内核文件,具体请参考https://kernelsu.org/zh_CN/guide/how-to-integrate-for-non-gki.html中
手动修改内核源码
部分的内容。在修改完成后再次拉取kernelsu(只是为了执行那个脚本,当然你也可以在内核根文件夹内执行kernelsu的脚本) -
如果你在执行build.sh时报错你可以尝试网上搜索报错原因,但我不建议你修改内核源码,因为大概率的报错是因为环境导致,你甚至可以直接问我(如果我可以看到的话),我是一定会回复你的
最后最后最后:由于这篇文章是我中午赶出来的,所以写的又乱又狗屎,如果你有哪里不明白,你。。。也可以问我