为什么要用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_action https://github.com/xiaoleGun/KernelSU_action
Github
- /Numbersf/Action-Build https://github.com/Numbersf/Action-Build
好吧,原本我试过好几个,但其实有价值的就这个两个,还有些Fork完试了一下就删了。我使用的设备树是LineageOS的开源成品,android_kernel_xiaomi_earth 同理,你也应该去找一下自己的内核源码。
接着,将目光转到Action,我们需要来配置一下Action。
配置Github Workflow
本次演示以xiaoleGun的KernelSU_action 为例。首先fork仓库,然后编辑这个环境变量文件。
打开内容如下,我简单打一下注释,其核心需要修改的部分就那几个。其他的我也不懂
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 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 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 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 ,将你的原厂Boot与MagiskBoot.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
重启之后应该就能看到生效了。
结语
我不知道为什么就我这样,查阅了不少视频和资料为什么其他人都能一遍过,到我这就不行了。这篇文章没啥价值,感觉太水了有点,幸运的是我至少达成了我的目标,感谢Oscar1640 !没有你的成品内核我连Wise都进不去。
额,我到底在干嘛。。