前言
我使用一加6T(fajita)+crDroid 安卓14,最近在折腾Root环境隐藏,但是使用Alpha面具总是会导致分区挂载异常,无法过环境,故尝试内核Root
后记:好一个KernelSU,模块刷不进去,授权Root直接卡死手机
后后记:GitHub找到解决方法了,Fork官方仓库自建了打好了补丁的仓库No-22-Github/Android_Kernel_with_KernelSU_Next_for_fajita
后后后记:感谢评论区提醒,其实有人在维护支持KernelSU的内核,可以直接下载release里的内核刷机包刷入TJ-Releases/crDroidPlusPlus_kernel
前置条件
由于Arch Linux并不适合做编译工作,所以我选择使用Docker容器内运行Ubuntu 22.04
而且docker环境隔离,玩炸了直接删掉就好了(
我的系统
OS:Arch Linux x86_64
Kernel: Linux 6.13.6-zen1-1-zen
Docker内系统
OS: Ubuntu 22.04.5 LTS x86_64
内核源码地址
GitHub android_kernel_oneplus_sdm845
KernelSU-Next文档
KernelSU-Next
编译
安装并启动docker
首先安装好Docker,将用户加入Docker组,然后重启电脑
1
2
3
4
5
6
|
yay -S docker
# 安装docker
sudo systemctl enable --now docker
# 启用doker服务
sudo usermod -aG docker $USER
# 将本用户加入docker组(免sudo使用docker)
|
然后重启电脑
docker换源(可选)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
####### 粘贴以下内容:
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.imgdb.de",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://cjie.eu.org"
]
}
####### 重启docker服务
sudo systemctl restart docker
|
安装容器并启动
1
2
3
4
5
6
7
8
|
docker pull ubuntu:22.04
# 拉取镜像
mkdir ~/android-kernel
# 在主机创建编译目录
docker run -it --name android-build \
-v ~/android-kernel:/root/android-kernel \
ubuntu:22.04
# 启动容器,并挂载主机的~/android-kernel到容器的/root/android-kernel
|
现在终端应该显示的是root@9eb5aa3a7c1b:/# ,其中9eb5aa3a7c1b是docker为容器随机分配的id,每个人的可能都不一样,这说明你已经进入容器了,可以开始随便折腾(编译工作)了
准备编译
接下来你应该在容器内输入下面的命令
1
2
3
4
|
apt update&&apt upgrade
# 更新系统
apt install nano bc bison ca-certificates ccache wget cmake curl file flex gcc g++ git zip libelf-dev libssl-dev make python3 texinfo u-boot-tools xz-utils gcc-12-aarch64-linux-gnu gcc-12-arm-linux-gnueabihf
# 编译所需要的依赖
|

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
cd ~/android-kernel
# 前往共享目录
wget -P ~/ https://cyfuture.dl.sourceforge.net/project/crdroid/fajita/10.x/crDroidAndroid-14.0-20250209-fajita-v10.12_boot.img
# 下载原boot镜像
git clone https://github.com/crdroidandroid/android_kernel_oneplus_sdm845.git --depth 1
# 克隆内核源码
git clone https://github.com/Bot-wxt1221/android_kernel_oneplus_sdm845.git --depth 1 patch1
git clone https://github.com/qlAD/kernel_oneplus_sdm845.git --depth 1 patch2
# 克隆补丁仓库
##############################
现在你的整体文件路径应该长这样
|-- android-kernel
| |-- android_kernel_oneplus_sdm845
| |-- patch1
| `-- patch2
`-- crDroidAndroid-14.0-20250209-fajita-v10.12_boot.img
##############################
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export CROSS_COMPILE_ARM32=arm-linux-gnueabihf-
# 配置环境变量
ln -s /usr/bin/arm-linux-gnueabihf-gcc-12 /usr/bin/arm-linux-gnueabihf-gcc
ln -s /usr/bin/aarch64-linux-gnu-gcc-12 /usr/bin/aarch64-linux-gnu-gcc
# 将gcc-12链接到-gcc
cd android_kernel_oneplus_sdm845
mkdir out
# 创建输出文件夹
curl -LSs "https://raw.githubusercontent.com/rifsxd/KernelSU-Next/next/kernel/setup.sh" | bash -
# 集成KernelSU-Next
cd ..
cp patch1/drivers/input/input.c android_kernel_oneplus_sdm845/drivers/input/input.c
cp patch1/fs/devpts/inode.c android_kernel_oneplus_sdm845/fs/devpts/inode.c
cp patch1/fs/exec.c android_kernel_oneplus_sdm845/fs/exec.c
cp patch1/fs/namespace.c android_kernel_oneplus_sdm845/fs/namespace.c
cp patch1/fs/open.c android_kernel_oneplus_sdm845/fs/open.c
cp patch1/fs/read_write.c android_kernel_oneplus_sdm845/fs/read_write.c
cp patch1/fs/stat.c android_kernel_oneplus_sdm845/fs/stat.c
# 应用补丁1号(su提权)
cp patch2/security/selinux/hooks.c android_kernel_oneplus_sdm845/security/selinux/hooks.c
cp patch2/security/selinux/include/classmap.h android_kernel_oneplus_sdm845/security/selinux/include/classmap.h
cp patch2/security/selinux/include/security.h android_kernel_oneplus_sdm845/security/selinux/include/security.h
cp patch2/security/selinux/selinuxfs.c android_kernel_oneplus_sdm845/security/selinux/selinuxfs.c
cp patch2/security/selinux/ss/services.c android_kernel_oneplus_sdm845/security/selinux/ss/services.c
# 应用补丁2号(模块加载)
|

配置编译选项
1
2
3
4
5
6
|
cd android_kernel_oneplus_sdm845/
# 进入内核源码树
scripts/extract-ikconfig ~/crDroidAndroid-14.0-20250209-fajita-v10.12_boot.img > out/.config
# 解包boot中的配置文件
make O=out menuconfig
# 图形化编辑编译选项
|
- 修改内核名称:
menuconfig -> General setup -> Local version - append to kernel release
Tips:关掉下面的Automatically append version information to the version string即可防止内核名出现dirty
- KernelSU已经默认开启(至少在我这是这样):
menuconfig -> General setup -> KernelSU
CONFIG_KPROBES不需要开启
- 有什么自己需要的功能可以顺便开启,不过可能会卡一或者编译不通过
然后用左右键选到Save,回车,保存配置文件,再Exit

编译
1
2
|
make O=out KCFLAGS='-w -std=gnu99 -O3' -j8
# j后面换成你的CPU核心数(线程数?)
|

CPU:装逼让你飞起来!
如果没有报错,编译完成后,./out/arch/arm64/boot/Image.gz-dtb文件就是你的内核(也就是主机的~/android-kernel/android_kernel_oneplus_sdm845/out/arch/arm64/boot/Image.gz-dtb)
刷入
使用AnyKernel刷入,本人较菜,就不重新打包了,选择使用——替换大法!
先下载Bot-wxt1221打包的另一个KSU内核刷机包(Github):AnyKernel.zip
解压,替换里面的Image.gz-dtb为你编译出来的内核,然后重新打包(zip -r0 Anykernel_KSUN.zip ./*)
将手机重启至rec模式,选择Apply update -> Apply from ADB ,然后将手机用数据线连接电脑,adb sideload Anykernel_KSUN.zip 即可刷入!