Featured image of post 在ArchLinux上编译支持KernelSU-Next的安卓内核

在ArchLinux上编译支持KernelSU-Next的安卓内核

前言

我使用一加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号(模块加载)

集成KSU

配置编译选项

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核心数(线程数?)

编译ing

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 即可刷入!

Have a try!
使用 Hugo 构建
主题 StackJimmy 设计
本博客已稳定运行