为什么要用KernelSU/SukiSU?

笔者在自己的远古设备Redmi12C上一直使用Magisk的root方案,确实稳定,最近一直在折腾海外虚拟卡/实体卡。单拎出Wise而言,刚装上就提示不支持在已Root的设备上运行,其他的银行直接卡在注册页,无法进入,Ifast更是直接卡崩。
呵呵了,我觉得面具已经没办法完成我的日常需求了,目光自然而然转向更新的Root方案,终究是老骥伏枥,不胜当年。
说真的,面具过过国内的银行还算轻松,但将目光放到海外的银行就是一大坨了。基本上都进不去。 KernelSU方案的隐藏性我还是认可的,除了比较挑设备外基本无敌,其知名分支SukiSU更是牛大了,闲话就说这么多,接下来来好好说说我是如何刷入的。希望能帮到在搜索引擎大海捞针的各位。

提示

请先确保设备已解锁Bootloader,并且在开始前备份好原厂boot避免设备变砖。

关于内核

开始请先确保自己系统在互联网上存在内核源码,本次构建使用Lineage-21演示,Github fork到自己的账户下。

感谢

感谢Gemini/DeepSeek,期间的报错都是他修复的,为我节省了不少时间。

纳尼?我的设备不支持?

刷Ksu的第一步永远是看自己的设备是否支持GKI,不幸的时,我不支持。

哦吼

这倒不是什么大问题,之前好歹也编译过OrangeFox,多少有点把握,依照Ksu的官方文档来看,只需要编译就好了。

如果应用程序显示 “不支持”,则表示您的设备不支持 KernelSU,你需要自己编译设备的内核才能使用,KernelSU 官方不会也永远不会为你提供一个可以刷写的 boot 镜像。

确定方案

构建这种东西,首先必要的就是Linux,如果我的主力机是Windows那么则为WSL。但考虑到要拉取的东西实在有点多,梯子也吃不消,我也不想把我的电脑搞得乱七八糟,因此直接走Github Action就成为了我的首选。

但Github的缺点也很明显,构建内核这种事情很难说一次成功,期间多少会遇到报错,你要查日志啥的还是挺麻烦的。

准备工作

  • 已解锁BL的手机
  • 内核源码,因为笔者系统是LineageOS,在github上可以轻松找到
  • 一个好心态

开始

我这个LineageOS比较老了,如上图所示,内核版本只有4.19,这个内核版本其实非常危险,太几把老了。
我也是后来在网上搜索才知道SukiSU貌似不支持这个内核版本,至少在我看来,即便README.md写了兼容4.14+(需自己编译),但是以我折腾的结果来看,其困难程度是非常大的,单靠Github Action非常困难。因此不考虑SukiSU,整了也肯定会报错的别问我怎么知道的

接下来就要把目光转向KernelSu,好在其生态已非常丰富,在搜索引擎随便一搜就能找到不少现成的工作流。这里简单列出来我试过的几个。

Github - /xiaoleGun/KernelSU_actionhttps://github.com/xiaoleGun/KernelSU_action


Github - /Numbersf/Action-Buildhttps://github.com/Numbersf/Action-Build


好吧,原本我试过好几个,但其实有价值的就这个两个,还有些Fork完试了一下就删了。我使用的设备树是LineageOS的开源成品,android_kernel_xiaomi_earth同理,你也应该去找一下自己的内核源码。
接着,将目光转到Action,我们需要来配置一下Action。

配置Github Workflow

本次演示以xiaoleGun的KernelSU_action为例。首先fork仓库,然后编辑这个环境变量文件。

env

打开内容如下,我简单打一下注释,其核心需要修改的部分就那几个。其他的我也不懂

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Lime
CONFIG_ENV=config.env

# 设备内核源码
KERNEL_SOURCE=https://github.com/LimeBlogs/android_kernel_xiaomi_earth
# 内核源码仓库分支
KERNEL_SOURCE_BRANCH=lineage-21
# 内核配置文件,一般是`${设备代号}`_defconfig
## 在设备内核/arch/arm64/configs查看
KERNEL_CONFIG=earth_defconfig
# 输出内核的压缩算法
## 对于我设备而言 可选 Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo
KERNEL_IMAGE_NAME=Image.gz
ARCH=arm64
ADD_LOCALVERSION_TO_FILENAME=false
EXTRA_CMDS:LLVM=1 LLVM_IAS=1

# Clang
## Custom
USE_CUSTOM_CLANG=false
CUSTOM_CLANG_SOURCE=
CUSTOM_CLANG_BRANCH=

### if your set USE CUSTOM CLANG to false than DO NOT CHANGE CUSTOM CMDS
CUSTOM_CMDS:CLANG_TRIPLE=aarch64-linux-gnu-

## AOSP
CLANG_BRANCH=master-kernel-build-2022
CLANG_VERSION=r450784e

# GCC
ENABLE_GCC_ARM64=true
ENABLE_GCC_ARM32=true
USE_CUSTOM_GCC_64=false
CUSTOM_GCC_64_SOURCE=
CUSTOM_GCC_64_BRANCH=
CUSTOM_GCC_64_BIN=aarch64-linux-android-
USE_CUSTOM_GCC_32=false
CUSTOM_GCC_32_SOURCE=
CUSTOM_GCC_32_BRANCH=
CUSTOM_GCC_32_BIN=arm-linux-androideabi-

# KernelSU flags
## 是否启用KernelSU
ENABLE_KERNELSU=true
KERNELSU_TAG=v0.9.5
KSU_EXPECTED_SIZE=
KSU_EXPECTED_HASH=

# Configuration
## 是否关闭`关闭链接时优化`
DISABLE-LTO=true
## 是否禁用`警告视为错误`
DISABLE_CC_WERROR=true
## 自动注入 Kprobes 配置
ADD_KPROBES_CONFIG=true
## 自动注入 OverlayFS 配置
ADD_OVERLAYFS_CONFIG=true
## 是否应用 KernelSU 源码补丁
### 适用于老版本内核4.9<= 推荐打开
APPLY_KSU_PATCH=true
REMOVE_UNUSED_PACKAGES=true

# AnyKernel3
## AnyKernel3 Custom
USE_CUSTOM_ANYKERNEL3=false
CUSTOM_ANYKERNEL3_SOURCE=
CUSTOM_ANYKERNEL3_BRANCH=

# Ccache
ENABLE_CCACHE=true

# DTBO image
NEED_DTBO=false

# Build boot images
## 是否输出Boot镜像
BUILD_BOOT_IMG=false
## 原Room的Boot链接
SOURCE_BOOT_IMAGE=https://raw.githubusercontent.com/LimeBlogs/KernelSU_action/main/boot/boot(2).img

首先来说说KERNEL_IMAGE_NAME咋填,可以在${内核源码}/arch/arm64/Makefile里

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#
# arch/arm64/boot/Makefile
#
# This file is included by the global makefile so that you can add your own
# architecture-specific flags and dependencies.
#
# This file is subject to the terms and conditions of the GNU General Public
# License. See the file "COPYING" in the main directory of this archive
# for more details.
#
# Copyright (C) 2012, ARM Ltd.
# Author: Will Deacon <will.deacon@arm.com>
#
# Based on the ia64 boot/Makefile.
#

OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S

targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo # 这里是支持的格式,推荐Image.gz

DTB_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE_NAMES))
ifneq ($(DTB_NAMES),)
DTB_LIST := $(addsuffix .dtb,$(DTB_NAMES))
else
DTB_LIST := $(dtb-y)
endif

DTBO_NAMES := $(subst $\",,$(CONFIG_BUILD_ARM64_DTB_OVERLAY_IMAGE_NAMES))
ifneq ($(DTBO_NAMES),)
DTB_LIST += $(addsuffix .dtbo,$(DTBO_NAMES))
endif

DTB_OBJS := $(addprefix $(obj)/dts/,$(DTB_LIST))

targets += $(DTB_LIST)

$(obj)/Image: vmlinux FORCE
$(call if_changed,objcopy)

$(obj)/Image.bz2: $(obj)/Image FORCE
$(call if_changed,bzip2)

$(obj)/Image-dtb: $(obj)/Image $(DTB_OBJS) FORCE
$(call if_changed,cat)

$(obj)/Image.gz: $(obj)/Image FORCE
$(call if_changed,gzip)

$(obj)/Image.lz4: $(obj)/Image FORCE
$(call if_changed,lz4)

$(obj)/Image.lzma: $(obj)/Image FORCE
$(call if_changed,lzma)

$(obj)/Image.lzo: $(obj)/Image FORCE
$(call if_changed,lzo)

$(obj)/Image.gz-dtb: $(obj)/Image.gz $(DTB_OBJS) FORCE
$(call if_changed,cat)

install:
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
$(obj)/Image System.map "$(INSTALL_PATH)"

zinstall:
$(CONFIG_SHELL) $(srctree)/$(src)/install.sh $(KERNELRELEASE) \
$(obj)/Image.gz System.map "$(INSTALL_PATH)"

我这里以Image.gz为例,接着,则是内核方面,去${内核源码}/Makefile,可以在顶部看到以下内容。

1
2
3
4
5
6
# SPDX-License-Identifier: GPL-2.0
VERSION = 4
PATCHLEVEL = 19
SUBLEVEL = 325
EXTRAVERSION =
NAME = "People's Front"

将这里一大堆拼起来就是4.19.325,在选择内核源码时尽量选择与自己所使用系统相符合的。按照注释填写完该填的,我们就可以开始构建啦!

运行工作流

期间可能会出现报错很大概率会出现,这种情况一般只能依靠自己的 互联网搜索能力LLM的使用能力了
等待构建完毕。。。。

运行中

插播一条消息

额

在构建了十几次依旧报错无法解决后,我心灰意冷,本来不报任何希望。接着我就在搜索引擎搜索,万一,我是说万一,万一真的有前人构建过了呢?


果不其然,还真是。

我去不早说

我看到Release的时候人都傻了,我千辛万苦挖报错,问AI,一天几十次在Action发呆。结果已经有成品了?这是个悲伤的故事,我们在做任何事前都要提前在网上找好资料。。万一有成品就不用重复造轮子了。这个是给KernelSU-Next做的适配,我是Lime,这个内核非常正常稳定,还是支持susfs的。。。不过这个作者使用的内核源码与我相同,只有分支不一样,我只需要稍微参考一下就知道自己到底输在哪。


为非 GKI 内核集成 KernelSU

参照KSU官方文档

做完这些,应该直接编译就能通了。如果你运气够好,依照上面的方法应该可以编译出一个内核,我手头上没有Linux,因此无法尝试,有时间我再继续更新这文章。
按理来说Action应该是支持这些步骤的,但我不知道为什么没生效。参照上一位成品大大的成品内核仓库,应该是提前对内核进行了集成再构建的,再次提到我没有Linux。其中涉及到Clang,对于一个不会C的人来说只让AI辅助也很麻烦了。那么这篇文章就先到这里吧,笔者要去休息了。。。

编译之后刷入

使用第三方Rec+AK3刷机包

将构建出的成品直接刷入即可,我在这个设备上试过,并没软用,可以尝试下面的的方法。

重新打包boot.img

首先我们在配置文件里设置的Image.gz其实是Boot中Kernel的镜像,准备好你ROM的Boot,然后下载Magiskboot,将你的原厂BootMagiskBoot.exe放在一个文件夹。

如图所示

然后,在此处打开Powershell/CMD,运行以下命令。

1
./magiskboot unpack boot.img

运行之后会出来一大堆文件,其中kernel就是我们需要替换的文件。

如图所示

我们将自己拿到的Image.gz或别的啥玩意解压,打开应该能看到一个独立的Image,解压出来,将其重命名为kernel,替换这个解包出来的kernel。


再使用MagiskBoot打包回去,

1
./magiskboot repack boot.img

注意,原厂的boot不用删,继续放那即可,文件夹会出现一个新的new-boot.img镜像,这就是我们需要的boot,直接使用fastboot刷入即可。

1
fastboot flash boot new-boot.img

重启之后应该就能看到生效了。

KernelSU-Next截图

结语

我不知道为什么就我这样,查阅了不少视频和资料为什么其他人都能一遍过,到我这就不行了。这篇文章没啥价值,感觉太水了有点,幸运的是我至少达成了我的目标,感谢Oscar1640!没有你的成品内核我连Wise都进不去。

额,我到底在干嘛。。