老设备还能不能 root:KernelSU 非 GKI 内核适配完整指南
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
KernelSU 是个跑在内核模式里的 Android root 方案,靠系统调用与 LSM 钩子在内核空间直接放行 root 请求。它的官方镜像只认 GKI 设备(GKI 是 Google 统一的内核镜像规范),最低从内核 4.14 算起。可当你的机器还停在 4.14~5.3 这种非 GKI 内核、管理器却弹出"不支持"时,别急着退——把 KernelSU 源码塞进自己的内核重新编译,照样能拿到内核级 root。这份 KernelSU 旧内核适配 / 非 GKI 设备 root 指南,从"能不能做"讲到"刷入怎么验",照着走就能落地。
🧭 先过三道关:这台机子到底能不能适配
这一步只回答一件事:你该不该花时间。三关都过了再往下。
- 内核版本:连上设备跑
adb shell uname -r,看主版本号。4.14 起步才在支持区间;低于 4.14 属于深度移植,新手不建议碰。
adb shell uname -r # 例:4.14.187-perf-g...,主版本 4.14 即可继续- 源码在不在手上:非 GKI 内核碎片化极重,没有统一编译流程,官方也不会给你现成 boot 镜像。前提是你已经能拿到这台设备的内核源码、并编出能正常开机的内核。内核闭源基本到此为止。
- kprobe 好不好使:KernelSU 默认靠 kprobe(内核探针,运行时给内核函数打钩子的机制)来挂钩子。kprobe 正常就走"自动集成",不正常就转"手动改源码"。
🛣 两条集成路线,先定方向
先选路再动手,选错方向会白改一堆源码。
- 自动集成(kprobe):kprobe 正常就选它,几乎不改内核代码,只加 KernelSU 源码再开配置。
- 手动改源码:kprobe 有上游 bug 或内核太老时用,要动四个系统调用和一个输入函数。
一个版本坑必须先说清:KernelSUv1.0 起放弃非 GKI 支持,最后一个支持版本是v0.9.5,集成时务必 checkout 这个 tag,别用 main。把源码拉下来:
git clone https://gitcode.com/GitHub_Trending/ke/KernelSU cd KernelSU && git checkout v0.9.5落地有两种:要么在内核根目录跑仓库自带的 kernel/setup.sh(它替你软链kernel/进drivers/,并补好drivers/Makefile与drivers/Kconfig的编译项);要么手动复制kernel/,在drivers/Makefile加obj-$(CONFIG_KSU) += kernelsu/,在drivers/Kconfig里source "drivers/kernelsu/Kconfig"。
🩹 手动集成要动的五个钩子点
选手动路线,本质就是在几个内核函数入口各插一段"条件调用",把 KernelSU 的处理函数接进去。共五处,四个必改、一处强烈建议。
do_execveat_common(fs/exec.c)—— 拦截执行,su 的核心。do_faccessat(fs/open.c,4.17 以前改faccessat)vfs_read(fs/read_write.c)vfs_statx(fs/stat.c,内核没有就用vfs_fstatat)input_handle_event(drivers/input/input.c)—— 安全模式入口,救砖靠它,务必加。
每处都是同一套路:在入口函数最前面加一段#ifdef CONFIG_KSU包着的判断与调用,示意:
#ifdef CONFIG_KSU if (unlikely(ksu_execveat_hook)) ksu_handle_execveat(&fd, &filename, &argv, &envp, &flags); #endif另两个按需:想让pm命令可用,补fs/devpts/inode.c;想在老内核上卸载模块,从 5.9 回移path_umount。完整 diff 见官方存档 how-to-integrate-for-non-gki.md。
⚙️ defconfig 与 kprobe 配置自检
编译前先确认开关对不对,错一个都可能白编一遍。先找到设备的 defconfig,通常在arch/arm64/configs/设备代号_defconfig,或在arch/arm64/configs/vendor/下,开关定义可对照 kernel/Kconfig。
- 两条路线都要
CONFIG_KSU=y;KernelSU 还依赖EXT4_FS,确认它已开。 - 自动路线:开
CONFIG_KPROBES=y、CONFIG_HAVE_KPROBES=y、CONFIG_KPROBE_EVENTS=y;若不生效多半是CONFIG_MODULES没开,make menuconfig搜 KPROBES 补依赖。 - 手动路线:反而要关掉
CONFIG_KPROBES——否则开机按音量下会误触安全模式。 - 调试期可临时开
CONFIG_KSU_DEBUG=y,定位完记得关。
CONFIG_KSU=y CONFIG_KPROBES=y # 仅自动路线 CONFIG_HAVE_KPROBES=y CONFIG_KPROBE_EVENTS=y # CONFIG_KSU_DEBUG=y # 调试临时开🔥 编译、fastboot boot 与功能验证
刷入有条铁律:先fastboot boot临时启动,确认不卡 logo,再谈永久刷写。临时启动不写分区,出问题重进 fastboot 即可,数据还在。
fastboot boot boot-ksu.img # 临时启动测试 adb shell su -c id # 应返回 uid=0(root) adb shell su -v # 应回显 KernelSU 版本再压一压稳定性:连重启 5 次都要能进系统;跑ksud module install装个测试模块,确认挂载生效;手动集成路线还要验证安全模式能救砖。
🩺 起不来 / su 失败的排查清单
按症状对号入座,别乱改:
| 症状 | 大概率原因 | 处理 |
|---|---|---|
| 卡在开机 logo | kprobe 不正常 | 注释ksu_sucompat_init/ksu_ksud_init验证,转手动路线 |
能开机但su没反应 | 钩子没接对 / SELinux 拒绝 | 核对五处钩子是否都改、策略是否放行 |
pm命令失败 | devpts 钩子缺失 | 补fs/devpts/inode.c |
| 模块挂不上 | overlayfs 配置缺失 | 确认 overlayfs 相关 CONFIG 已开 |
✅ 适配完成自检清单
收尾不画饼,照这张表打勾,全过才算成:
- 内核主版本 ≥ 4.14,源码可编译、能开机
- 版本锁在v0.9.5,非 main
CONFIG_KSU=y+EXT4_FS已开;自动路线 kprobe 三项齐全 / 手动路线已关 KPROBES- 五个钩子全部接入,安全模式已开
fastboot boot通过后再永久刷写su -c id返回uid=0,模块与重启稳定性验证通过
一句话决策:kprobe 正常走自动、只加配置;kprobe 异常或内核偏老走手动、关 KPROBES 改五处;源码闭源则无解,直接放弃。
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考