如何给 Linux 4.14 旧内核适配 KernelSU:安卓老设备非 GKI 适配完整教程
如何给 Linux 4.14 旧内核适配 KernelSU安卓老设备非 GKI 适配完整教程【免费下载链接】KernelSUA Kernel based root solution for Android项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSUKernelSU 是直接在 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.c的do_faccessat4.17 前无此函数直接改faccessat系统调用定义fs/exec.c的do_execveat_commonfs/read_write.c的vfs_readfs/stat.c的vfs_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_KSUy以及 kprobe 三件套CONFIG_KPROBESy、CONFIG_HAVE_KPROBESy、CONFIG_KPROBE_EVENTSy。如果 kprobe 不生效通常是依赖项CONFIG_MODULES没开可以用make menuconfig搜 KPROBES 查依赖适配期想多看日志还可以打开 Kconfig 里的CONFIG_KSU_DEBUG调试开关。然后编译打包make ARCHarm64 CROSS_COMPILEaarch64-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卡在开机 logoSELinux 启动循环症状设备停在开机画面adb logcat 出现avc: denied { module_load }原因SELinux 策略Android 内核的强制访问控制策略拒绝了相关模块操作解法在 SELinux 策略中放开模块加载权限重新打包 boot 镜像再测坑 3模块功能异常OverlayFS 不生效症状模块无法挂载系统分区的修改不生效原因内核没编进 OverlayFS 叠层挂载能力一种盖在真实分区之上、用来遮盖文件的虚拟文件系统解法确认内核配置中CONFIG_OVERLAY_FSy、CONFIG_OVERLAY_FS_INDEXy、CONFIG_OVERLAY_FS_REDIRECT_DIRy三个开关已启用适配验收从 su 到模块的验证清单adb shell su -v # 应显示 KernelSU 版本信息 adb shell su -c id # 应显示 uid0(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 次每次都能正常进入系统 → 稳定性达标刷机安全底线三步不炸机先备份。刷机前用 KernelSU 管理器的备份功能保存原始 boot 分区的一份副本重要数据同样先备份。临时启动测试。在 fastboot 环境用临时启动加载新镜像只影响这一次开机重启后自动还原fastboot boot boot-ksu.img确认稳定再永久刷写。多次重启无异常后再用 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),仅供参考