如何给 Linux 4.14 旧内核适配 KernelSU:安卓老设备非 GKI 适配完整教程
2026/9/10 14:25:28 网站建设 项目流程

如何给 Linux 4.14 旧内核适配 KernelSU:安卓老设备非 GKI 适配完整教程

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

KernelSU 是直接在 Android 内核里运行的 root 方案,本教程面向 Linux 4.14+ 的非 GKI 老内核设备,带你走通兼容诊断、源码集成、编译打包与功能验收的完整适配流程。

场景:老设备装上管理器,提示"不支持"

你在老设备上安装 KernelSU 管理器 App,打开后状态栏显示"不支持",官方渠道也找不到你这台机型的现成 boot 镜像。这不是 bug,而是设备属于非 GKI 阵营的信号。GKI(通用内核镜像,General Kernel Image)是 Android 12 起推行的统一内核镜像规范,不走 GKI 的设备内核由厂商各自维护,版本五花八门,也没有统一的模块加载入口。

先给结论:内核在 4.14 及以上、且源码公开,就可以适配,路径就是"把源码集成进内核自己编译"。这也是"安卓老设备怎么 root"最靠谱的答案。

KernelSU 对非 GKI 设备的官方支持在 v1.0 之后停止,能集成的最后版本是 v0.9.5,后续步骤必须指定这个版本。

30 秒诊断:这台设备的内核能不能支持 KernelSU

动手前先回答两个问题:能不能解锁 bootloader(引导加载程序,控制是否允许刷入第三方镜像的开关);内核是什么版本。

第一题是一票否决项:KernelSU 必须解锁 bootloader,解不了锁就没有适配的前提。

第二题用一条命令:

adb shell uname -r

输出形如4.19.191-android11-8-gb2f41e6,最前面一组数字(4.19)就是内核版本,后面是厂商构建后缀,可以忽略。判定标准分三档:

  • 5.10 及以上:标准 GKI 内核适配场景,直接用官方 boot 镜像,无需适配
  • 4.14 ~ 5.9:需要适配,即本教程目标,"4.14 内核如何支持 KernelSU"都走下面这套流程
  • 4.14 以下:需要深度移植核心模块,不建议新手折腾

还有一个硬性前提:你能用设备的内核源码编译出一个可以正常开机的内核。如果内核不公开,适配基本无从谈起。

为什么不行:旧内核的三道技术障碍

第一道:没有稳定模块接口。KMI(内核模块接口)是 GKI 设备用来"插拔"外部模块的一组稳定接口,老内核没有它,KernelSU 无法以模块形式加载,只能把源码直接编进内核。

第二道:关键 API 缺失。KernelSU 要挂钩的函数在不同版本里名字不同:旧内核没有vfs_statx,得用vfs_fstatat顶替;4.17 之前的内核没有do_faccessat,得直接找faccessat系统调用的定义。项目内置了兼容层来吸收这些差异,比如文件操作兼容层、sepolicy 补丁代码、LSM 钩子实现。

第三道:构建配置未启用。内核的 Kconfig(管理编译开关的体系)里,CONFIG_KSU默认不开,KernelSU 挂钩主路径依赖的 kprobe 开关也经常是关的。kprobe 是内核的动态探针机制,相当于"往正在运行的内核代码里插探针"。

KernelSU 旧内核适配四步走:从源码到 boot

第一步:集成源码

git clone https://gitcode.com/GitHub_Trending/ke/KernelSU # 在你的设备内核源码根目录执行集成脚本,并指定版本 bash <KernelSU路径>/kernel/setup.sh v0.9.5

脚本会自动把 kernel 目录以软链接挂进内核源码树,并注册构建条目。集成脚本支持传入版本号参数,传 v0.9.5 即检出最后一个支持非 GKI 的版本。

第二步:挂接系统调用钩子(kprobe 不可用时)

如果 kprobe 在你设备上工作正常,跳到第四步直接编译即可。否则需要手动挂钩四处(系统调用,即用户程序进入内核的入口):

  • fs/open.cdo_faccessat(4.17 前无此函数,直接改faccessat系统调用定义)
  • fs/exec.cdo_execveat_common
  • fs/read_write.cvfs_read
  • fs/stat.cvfs_statx(没有则改用vfs_fstatat

改法统一:在目标函数开头加一段被CONFIG_KSU包裹的钩子调用。以fs/exec.c为例:

#ifdef CONFIG_KSU if (unlikely(ksu_execveat_hook)) ksu_handle_execveat(&fd, &filename, &argv, &envp, &flags); #endif

其余三处同理,在函数开头调用对应的ksu_handle_*函数。如果集成后手机无法开机,多半是 kprobe 工作不正常,官方文档给了快速验证法:注释掉ksu.c里的ksu_sucompat_init()ksu_ksud_init(),若能正常开机就是 kprobe 的问题。

第三步:启用安全模式

安全模式是救砖通道:改坏了,设备会进安全模式,KernelSU 被临时禁用。修改drivers/input/input.c中的input_handle_event函数,在函数开头加入钩子调用:

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

采用手动集成时,务必关闭CONFIG_KPROBES,否则用户开机后按音量下键也可能误触发安全模式。

第四步:编译并打包 boot

先在设备 defconfig(内核默认配置文件,可能在arch/arm64/configs/arch/arm64/configs/vendor/)中加入CONFIG_KSU=y,以及 kprobe 三件套CONFIG_KPROBES=yCONFIG_HAVE_KPROBES=yCONFIG_KPROBE_EVENTS=y。如果 kprobe 不生效,通常是依赖项CONFIG_MODULES没开,可以用make menuconfig搜 KPROBES 查依赖;适配期想多看日志,还可以打开 Kconfig 里的CONFIG_KSU_DEBUG调试开关。

然后编译打包:

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- -j$(nproc) # 把内核与 ramdisk 打包成 boot 镜像 mkbootimg --kernel arch/arm64/boot/Image.gz --ramdisk ramdisk.img --output boot-ksu.img

避坑指南:老内核 3 个高频坑

坑 1:编译报错,结构体定义缺失

  • 症状:编译时报某个结构体(如user_namespace)未定义
  • 原因:旧内核的类型定义不全,新代码引用了不存在的结构
  • 解法:在内核兼容头文件中按版本条件补上对应结构体的简化定义,只作用于旧版本区间

坑 2:卡在开机 logo,SELinux 启动循环

  • 症状:设备停在开机画面,adb logcat 出现avc: denied { module_load }
  • 原因:SELinux 策略(Android 内核的强制访问控制策略)拒绝了相关模块操作
  • 解法:在 SELinux 策略中放开模块加载权限,重新打包 boot 镜像再测

坑 3:模块功能异常,OverlayFS 不生效

  • 症状:模块无法挂载,系统分区的修改不生效
  • 原因:内核没编进 OverlayFS 叠层挂载能力(一种盖在真实分区之上、用来遮盖文件的虚拟文件系统)
  • 解法:确认内核配置中CONFIG_OVERLAY_FS=yCONFIG_OVERLAY_FS_INDEX=yCONFIG_OVERLAY_FS_REDIRECT_DIR=y三个开关已启用

适配验收:从 su 到模块的验证清单

adb shell su -v # 应显示 KernelSU 版本信息 adb shell su -c id # 应显示 uid=0(root) adb push test_module.zip /data/local/tmp/ adb shell su -c "ksud module install /data/local/tmp/test_module.zip"

逐项核对:

  • su -v能输出版本 → KernelSU 已在内核中生效
  • su -c id显示 root → 基础提权正常
  • 模块安装无报错 → 模块系统正常
  • 连续重启设备 5 次,每次都能正常进入系统 → 稳定性达标

刷机安全底线:三步不炸机

  1. 先备份。刷机前用 KernelSU 管理器的备份功能保存原始 boot 分区的一份副本,重要数据同样先备份。
  2. 临时启动测试。在 fastboot 环境用临时启动加载新镜像,只影响这一次开机,重启后自动还原:
fastboot boot boot-ksu.img
  1. 确认稳定再永久刷写。多次重启无异常后,再用 fastboot 把同一镜像正式刷入 boot 分区。

收尾

老设备不再是 root 绝缘体,只要内核源码公开且可编译,4.14+ 旧内核都能走通 KernelSU 适配全流程。更多补丁细节参考官方非 GKI 集成文档与常见问题,编译开关定义见 kernel/Kconfig。

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

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

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

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

立即咨询