在 4.14+ 非 GKI 内核上跑通 KernelSU:检测、集成与验证
2026/9/10 23:20:14 网站建设 项目流程

在 4.14+ 非 GKI 内核上跑通 KernelSU:检测、集成与验证

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

KernelSU 低版本内核适配(4.14 及以上、非 GKI 设备)的结论先说:自 v1.0 起官方不再支持非 GKI 设备(见集成文档顶部的存档声明),唯一路径是把 v0.9.5 的源码集成进自己的内核源码树并自行编译。集成方式只有两种:kprobe 自动挂钩(推荐),或者手动修改内核里 4 个系统调用位置。本文按检测、集成、验证的顺序走完整个流程。

判断设备是否适合自行编译

先确认环境在适用范围之内,避免白做。

内核环境是否适用方式与前提
GKI 设备(能刷官方 boot)不适用本文管理器直接安装,见安装指南
非 GKI、4.14+,kprobe 正常推荐kprobe 集成,不改内核源码
非 GKI、4.14+,kprobe 异常或版本过老适用手动改 4 个系统调用挂钩点
拿不到内核源码不适用前提是你能从源码编出可开机的内核

三个边界条件:官方最低支持到 4.14;该集成文档已存档、不再维护,所以源码必须用 v0.9.5;非 GKI 内核碎片化严重,没有统一编译方法,boot 镜像需要自己出。

检查内核版本并备份 boot

这一步解决两个问题:版本是否落在支持区间,刷机失败后能否回退。

adb shell uname -r

输出形如4.19.191-android11-8-gb2f41e6,只看前面的内核主版本号,Android 系统版本号与它无关。随后安装 KernelSU 管理器应用:显示"不支持"说明设备是本文的目标;显示"未安装"说明设备已受支持,无需自行编译。

动手前先备份原厂boot.img(方法见安装文档的"备份你的 boot.img"一节)。它是本文流程里唯一的可靠回退手段。

把 KernelSU 源码集成进内核源码树

这一步解决 KernelSU 代码如何进入你的编译体系。改动共四处:一个软链接、drivers/Makefiledrivers/Kconfig各加一行。

仓库自带的 kernel/setup.sh 干的就是这几件事:克隆本仓库、检出指定 tag、建软链接drivers/kernelsu指向KernelSU/kernel/、往drivers/Makefiledrivers/Kconfig各加一行。网络受限时手动做等价操作,先取 v0.9.5 标签的源码(必须用 v0.9.5,这是支持非 GKI 的最后一个版本):

git clone https://gitcode.com/GitHub_Trending/ke/KernelSU cd KernelSU && git checkout v0.9.5

再回到内核源码根目录建软链接,并补上两行构建注册。追加的内容与 setup.sh 完全一致,CONFIG_KSU是总开关:

ln -s /绝对路径/KernelSU/kernel drivers/kernelsu echo 'obj-$(CONFIG_KSU) += kernelsu/' >> drivers/Makefile echo 'source "drivers/kernelsu/Kconfig"' >> drivers/Kconfig

加完之后内核构建系统就能识别CONFIG_KSU选项(该选项定义见 kernel/Kconfig)。v0.9.5 中把它设为y即启用,设为n即禁用。

在 defconfig 中启用 KernelSU 与 kprobe

kprobe 集成方式依赖内核的 kprobe 机制(内核动态挂钩点)来安装钩子,前提是配置里开了相关选项,缺一个钩子都装不上。

找到你设备的 defconfig(通常在arch/arm64/configs/设备代号_defconfigarch/arm64/configs/vendor/设备代号_defconfig),按集成文档添加:

# KernelSU CONFIG_KSU=y CONFIG_KPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_KPROBE_EVENTS=y

第一行启用 KernelSU,后三行启用 kprobe。如果编译后 KPROBES 仍未生效,多半是CONFIG_MODULES等依赖没开,用make menuconfig搜 KPROBES 勾选依赖项即可。

这一步做完就用你现有的编译流程重新编译内核,不需要别的改动。如果刷入后无法开机,直接跳到"手动改内核源码集成"一节。

kprobe 不工作:手动修改内核源码集成

当 kprobe 因上游 bug 或内核版本过老无法工作时,需要显式挂钩 4 个系统调用入口。四处改动模式相同:extern声明 KernelSU 的处理函数,在目标内核函数开头调用它。以fs/exec.c为例,新增声明和函数体开头的调用(完整 diff 在集成文档中):

#ifdef CONFIG_KSU extern bool ksu_execveat_hook __read_mostly; extern int ksu_handle_execveat(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags); extern int ksu_handle_execveat_sucompat(int *fd, struct filename **filename_ptr, void *argv, void *envp, int *flags); #endif

do_execveat_common函数体开头用if (unlikely(ksu_execveat_hook))判断走ksu_handle_execveat还是ksu_handle_execveat_sucompat,关掉钩子时直接走原逻辑__do_execve_file。其余三处与版本差异:

内核函数文件挂钩函数版本差异
do_faccessatfs/open.cksu_handle_faccessat4.17 以前无此函数,改faccessat系统调用定义
do_execveat_commonfs/exec.cksu_handle_execveat
vfs_readfs/read_write.cksu_handle_vfs_read
vfs_statxfs/stat.cksu_handle_statvfs_statx时改用vfs_fstatat

手动集成时务必在 defconfig 里关掉CONFIG_KPROBES,否则开机后按音量下键会误触发 KernelSU 安全模式,集成文档原文明确警告了这个坑。

开启安全模式预留救砖通道

安全模式是 KernelSU 的救砖入口:开机后按音量下进入,可以恢复原有 boot。启用它需要再改一处drivers/input/input.c,在input_handle_event函数体开头插入对输入事件的挂钩,ksu_input_hook关闭时这行不产生任何开销:

#ifdef CONFIG_KSU if (unlikely(ksu_input_hook)) ksu_handle_input_handle_event(&type, &code, &value); #endif

完整 diff 在集成文档的"安全模式"小节。文档强烈建议开启,它是模块出问题后唯一的自救通道。

编译刷机后验证 KernelSU 生效

验证分三层:内核能启动、管理器能识别、su输出 root。

先用 fastboot 刷入编译出的 boot,确认设备正常开机,并用下面的命令确认内核版本无误:

adb shell uname -r

再打开管理器应用:状态不再显示"不支持",而是识别出内核里的 KernelSU 版本。最后确认提权链路真正打通:

adb shell su -c id # 预期输出: uid=0(root) gid=0(root) groups=0(root)

输出uid=0即适配完成。

处理四个高频故障

现象:刷入后无法开机,卡在 logo。原因:kprobe 在该内核上工作不正常,挂钩安装直接导致内核异常。解法:按集成文档的验证方法,注释掉 v0.9.5 源码kernel/ksu.c中的ksu_sucompat_init()ksu_ksud_init()再编译测试,若恢复正常即可确认是 kprobe 问题——要么修 kprobe,要么转"手动改 4 个位置"的方案。

现象:没有按音量下键却进了安全模式。原因:手动集成时没有禁用CONFIG_KPROBES,开机按键事件被误判。解法:defconfig 设CONFIG_KPROBES=n重新编译。

现象:pm命令执行失败。原因:devpts 设备点处理未被挂钩。解法:在fs/devpts/inode.cdevpts_get_priv开头加一行ksu_handle_devpts(dentry->d_inode);,补丁见集成文档的"pm 命令执行失败?"小节。

现象:开了 KPROBES 配置但仍未生效。原因:缺依赖项,最常见的是CONFIG_MODULES。解法:make menuconfig搜 KPROBES,逐项启用其依赖。

收尾的四条可执行建议

  1. 刷机前备份原厂boot.img,全程保留 fastboot 连接,这是唯一可靠的回退路径。
  2. 优先走 kprobe 方案,确认它不工作再动手改内核源码,手动改 4 处的工作量明显更大。
  3. 手动集成时关闭CONFIG_KPROBES并开启安全模式,两处改动成本极低,却能避免误入安全模式和救不了砖。
  4. 官方自 v1.0 起不再维护非 GKI 支持,后续想升级 KernelSU 需要自行向新版本移植,否则停留在 v0.9.5。

【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询