KernelSU 旧内核适配完整指南:一步步给 Linux 4.14~5.3 的安卓设备装 root
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
KernelSU 是一款 Android 内核级 root 方案,这篇旧内核适配教程面向 4.14~5.3 内核的非 GKI 设备:先判断走哪条路线,再拉源码、集成、编译、刷入,最后把 root 装到旧手机上并学会怎么回滚。
🧭 先判断再动手:你的设备该走哪条路
先在设备上跑一条命令:
adb shell uname -r # 示例输出:4.19.191-android11-8-gb2f41e6看主版本号,再确认能不能拿到内核源码,然后三选一:
- A 路线(免编译):版本号
5.10及以上。这是 GKI(通用内核镜像,官方统一的内核镜像)设备,直接刷官方发布镜像即可,本文后面的编译部分不用看,转 安装教程。 - B 路线(自动集成):
4.14~5.9(典型是 4.19),内核源码开源,且 kprobe(内核探针点,不改源码的挂钩机制)大概率可用。只跑一个脚本、开几个配置,改动最小。 - C 路线(手动插钩子):内核太旧踩到边界情况,或 B 路线刷进去开不了机。手动改 4 个系统调用入口加安全模式代码。
前提:内核源码必须开源。拿不到源码就别硬编,编不出能开机的内核,后面所有步骤对你都不成立。
✅ 动手前清单:6 项准备
- 你设备的内核源码,版本与当前
uname -r对应(厂商开源仓库或原厂内核) - arm64 交叉编译工具链(如
aarch64-linux-android-或 prebuilts gcc) mkbootimg(或用你 ROM 自带的 boot 打包工具链)- 原始 boot 镜像备份(已 root 用
adb shell su -c dd导出,否则从原厂固件包提取) - 引导已解锁,电脑装好 adb/fastboot
- KernelSU 仓库里能切到
v0.9.5标签——非 GKI 支持到此为止,v1.0 起官方不再支持
📦 分阶段适配流程:从源码到刷入
阶段一:拉源码
克隆你自己的内核源码,同时克隆 KernelSU 仓库:
git clone https://gitcode.com/GitHub_Trending/ke/KernelSU把 KernelSU 目录放到内核源码根目录下(与drivers平级)。放在根目录的原因:集成脚本认这个目录,不会再尝试联网拉代码。
阶段二:集成并改配置
在内核根目录跑官方集成脚本,并固定到最后支持非 GKI 的版本:
cd /path/to/your-kernel-source bash KernelSU/kernel/setup.sh v0.9.5这个脚本替你做了三件事:建drivers/kernelsu软链接、往 Makefile 写编译条目、往 Kconfig 加配置项,不用手改。
然后编辑你的 defconfig(通常在arch/arm64/configs/设备代号_defconfig,也可能在vendor/下),打开这几个开关:
# KernelSU 主开关 CONFIG_KSU=y # kprobe 三项,B 路线必开 CONFIG_KPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_KPROBE_EVENTS=y如果 KPROBES 勾上却不生效,先查依赖CONFIG_MODULES=y是否漏掉;另外KSU选项本身还依赖EXT4_FS(见 配置项定义)。
阶段三:(仅 C 路线)插 4 个钩子
B 路线直接跳到阶段四。C 路线要在 4 个系统调用入口插入钩子调用:do_faccessat(fs/open.c)、do_execveat_common(fs/exec.c)、vfs_read(fs/read_write.c)、vfs_statx(fs/stat.c)。Linux 4.14 设备没有vfs_statx的,用vfs_fstatat代替;早于 4.17 没有do_faccessat的,直接改faccessat系统调用。
以fs/exec.c为例,在do_execveat_common里调用__do_execve_file之前插入(extern 声明放在文件头部):
static int do_execveat_common(int fd, struct filename *filename, struct user_arg_ptr argv, struct user_arg_ptr envp, int flags) { #ifdef CONFIG_KSU /* ksu_execveat_hook:管理器开启后才生效 */ if (unlikely(ksu_execveat_hook)) ksu_handle_execveat(&fd, &filename, &argv, &envp, &flags); else ksu_handle_execveat_sucompat(&fd, &filename, &argv, &envp, &flags); #endif return __do_execve_file(fd, filename, argv, envp, flags, NULL); }为什么改这里:这 4 个入口正是系统判断"哪个应用在跑、哪个文件在被打开"的地方,KernelSU 必须钩住它们才能区分调用者并放行权限。完整 diff 补丁在 非 GKI 集成文档 里,逐段对照贴即可。
顺手把drivers/input/input.c的input_handle_event也改了,接上安全模式(开机按音量下进恢复模式)。这是救砖保险,强烈建议改。注意:手动插钩子后必须关掉CONFIG_KPROBES,否则开机按音量下也会误触发安全模式。
阶段四:编译内核
# 交叉编译前缀按你的工具链调整 make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- -j$(nproc)产物一般在arch/arm64/boot/Image,压缩过的 ROM 可能是Image.gz、Image.lz4等,以你 ROM 原内核的格式为准。
阶段五:打包 boot 镜像
用和原始 boot 完全一致的参数重新打包(页大小、header 版本),不一致会直接开不了机:
mkbootimg --kernel arch/arm64/boot/Image \ --ramdisk ramdisk.img \ --pagesize 4096 --header_version 2 \ --output boot-ksu.img阶段六:先测试再刷入
# 只测试不写分区,有问题重启即恢复 fastboot boot boot-ksu.img # 确认正常后再正式写入 fastboot flash boot boot-ksu.img🩺 排障速查:4 个高频坑
卡开机 logo 起不来→ 最大可能是内核 kprobe 坏了(B 路线最常见) → 先用fastboot boot排除刷入问题;再注释kernel/ksu.c里的ksu_sucompat_init()和ksu_ksud_init()两个初始化验证,能开机就是 kprobe 的锅,转 C 路线。
管理器显示不支持、su无效→CONFIG_KSU没开,或用了 v1.0 之后的版本代码 → 回查 defconfig,切回v0.9.5重新编译。
莫名进安全模式(开机按了音量下)→ 手动改了钩子但CONFIG_KPROBES还开着 → 关掉 KPROBES 重编。
su 可用但pm命令执行失败→ 漏了 devpts 补丁 → 在fs/devpts/inode.c的devpts_get_priv里加ksu_handle_devpts钩子(补丁见官方文档)。
🔍 验证与回滚
adb shell su -c id # 预期:uid=0(root) gid=0(root)再进管理器确认 root 已启用,装一个小模块验证功能生效,重启 3 次确认无异常。
收尾前记住两件事:备份的boot-backup.img留好,出问题就fastboot flash boot boot-backup.img回滚;如果卡在开机且连不上 adb,按住音量下(前提你接了安全模式)进恢复模式重刷。
延伸参与与资源入口
如果你把某个机型调通了,值得把你的 defconfig 改动和钩子补丁贴出来,同机型的用户最需要它;非 GKI 的官方支持停在v0.9.5,旧内核的适配维护本来就靠社区。
- 非 GKI 集成文档(存档版)
- 安装教程
- 刷入后开不了机的救援方法
【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考