如何让旧手机用上 KernelSULinux 4.14 非 GKI 内核适配实操【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSUKernelSU 是目前最流行的内核级 root 方案root 权限不再来自被替换的 su 二进制文件而是直接长在内核里应用想提权必须先过内核这一关。但麻烦在于官方现成镜像只面向 GKIGoogle 通用内核镜像一套内核通吃众多机型设备。如果你的老机器内核还停留在 4.14 到 5.4 之间管理器会直接判定不支持。这篇文章按自检 → 选路线 → 改内核 → 防变砖的顺序把为这类老内核集成 KernelSU 的完整流程走一遍。动手前先确认这三件事不是每台老手机都适合折腾集成前先回答三个问题内核版本够不够官方下限是 Linux 4.14低于这个版本只能算理论可行。一条命令就能看到版本adb shell uname -r # 例4.19.191-android11-8-gb2f41e6重点看开头的 4.19有没有可用的内核源码非 GKI 内核碎片化严重厂商各自为政没人能替你出 boot 镜像一切都要自己编译。前提是你已经能从自家设备的内核源码编译出能正常开机的内核源码不开源的话这条路基本走不通。kprobe 是否可用kprobe 可以理解为内核自带的监听点KernelSU 靠它挂钩内核函数而不用改动源码。这是首选路线的命脉后面会讲怎么验证。另外要心里有数KernelSU 从 1.0 版本起已停止对非 GKI 内核的官方支持最后一个兼容版本是 v0.9.5所以本文所有操作都固定在这个 tag 上。路线一靠 kprobe 自动集成十分钟搞定如果 kprobe 在你的内核里工作正常大多数 4.14 的厂商内核都能用推荐这条路线——几乎不用手改代码。在内核源码的根目录下执行官方集成脚本curl -LSs https://raw.githubusercontent.com/tiann/KernelSU/main/kernel/setup.sh | bash -s v0.9.5脚本会自动拉取仓库、切到 v0.9.5把 kernel 目录软链进drivers/并往 Makefile 和 Kconfig 里各插一行注册项。脚本逻辑本身不复杂可以对照仓库里的 kernel/setup.sh 看它做了什么手动集成时也可以先git clone https://gitcode.com/GitHub_Trending/ke/KernelSU再打 tag。集成完检查配置缺了就补上CONFIG_KPROBESy CONFIG_HAVE_KPROBESy CONFIG_KPROBE_EVENTSy这里有个隐蔽的坑KPROBES 依赖CONFIG_MODULES模块支持没开的话勾了也不生效。若仍不生效用make menuconfig搜索 KPROBES 逐项补齐它的其他依赖。之后正常编译内核即可。怎么确认 kprobe 是不是罪魁祸首官方给过一个干净的排查法临时注释掉 kernel/core/init.c 中对ksu_sucompat_init()和ksu_ksud_init()的调用再编译如果手机能正常开机说明问题出在 kprobe 本身——要么修这个内核的 kprobe bug要么转路线二。路线二手动插四个钩子进内核源码kprobe 失灵通常见于内核太老或厂商改了安全机制时就得自己动手把 KernelSU 的处理函数接进四个内核系统调用里。集成步骤与路线一相同区别在于要在 defconfig 里写死开关# KernelSU CONFIG_KSUy注意 defconfig 不一定叫你想的名字很多厂商放在arch/arm64/configs/设备代号_defconfig或arch/arm64/configs/vendor/下。接下来是四个必改的钩子点它们各自拦住一类系统行为KernelSU 借机识别谁在请求 root钩子函数所在文件通俗理解do_faccessatfs/open.c应用摸一下文件看有没有权限时触发do_execveat_commonfs/exec.c应用启动新进程比如执行 su时触发vfs_readfs/read_write.c读文件内容时触发vfs_statxfs/stat.c查询文件属性时触发每处的改法套路一致声明外部钩子标志和处理函数在函数入口加一段判断。以fs/exec.c为例#ifdef CONFIG_KSU if (unlikely(ksu_execveat_hook)) ksu_handle_execveat(fd, filename, argv, envp, flags); #endif return __do_execve_file(fd, filename, argv, envp, flags, NULL);老内核还有两个替代情况没有vfs_statx就用vfs_fstatat顶上内核早于 4.17 没有do_faccessat就去找faccessat系统调用的定义处下钩子。完整的参照补丁在官方存档文档里见 website/docs/zh_CN/guide/how-to-integrate-for-non-gki.md。顺手把安全模式也接上安全模式是 KernelSU 的防砖保命键开机第一屏后连按三下音量下键按-松开的节奏内核会禁用所有模块进入安全模式让你有机会卸掉闯祸的模块。它需要在drivers/input/input.c的input_handle_event里接一个输入事件钩子。这里有个反直觉的要求走手动集成路线时一定要把CONFIG_KPROBES关掉。否则两条捕获通道都在监听音量键用户没做任何事也可能被莫名推进安全模式。官方文档对开启此功能的态度是强烈建议因为救砖时它真的有用。编译、验证与防变砖三连编译流程因设备而异但顺序建议固定先用fastboot boot临时启动新内核测试一切正常再考虑永久刷写——临时启动不写分区出问题拔线重启即恢复。如果最后仍然变砖刷回原厂 boot 就能救回来所以刷机前备份原厂 boot 是硬性动作。开机后按三步验证adb shell su -c id返回uid0(root)说明内核钩子生效装一个最小模块改个系统属性即可重启后确认修改仍在说明模块链路ksud→ init.rc 注入走通连续重启 5 次 高频使用常用 root 应用观察有无随机重启重点盯dmesg里的 kprobe 相关报错。万一模块装出问题开不了机别慌开机第一屏连按三下音量下进入安全模式在管理器里卸载问题模块或走 recovery 清理/data/adb/ksud相关注入文件。详细方法参考仓库自带的 website/docs/zh_CN/guide/rescue-from-bootloop.md。踩坑速查老内核适配最常见的五个坑症状大概率原因处理办法集成后手机无法开机kprobe 在该内核上工作异常注释ksu_sucompat_init()/ksu_ksud_init()验证转手动集成勾了 KPROBES 仍不生效依赖项CONFIG_MODULES未启用make menuconfig搜索 KPROBES逐项开启依赖没按任何键却进了安全模式手动集成却没关CONFIG_KPROBES关闭该配置重新编译pm等命令执行失败少了fs/devpts/inode.c的devpts_get_priv补丁按官方存档文档补上这一处管理器显示未安装/不支持用了 1.0 版本去适配老内核集成时固定指定v0.9.5tag最后提醒一点v0.9.5 之后官方把精力放回了 GKI 与 LKM 方向你基于旧 tag 的集成成果属于社区自维护升级前务必先在测试机上走一遍本文流程。把原厂 boot 备份和内核源码存档放在手边再动手是这套流程里成本最低、收益最高的保险。【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
