KernelSU: 支持模块了!
大约一个月前,我告诉大家 KernelSU 即将支持模块功能,然而这么久过去了好像一点动静也没有...
主要是最近这段时间有点私事,实在是忙不过来;但好事多磨,该有的也一定会有。所以今天我来告诉大家,KernelSU 已经支持模块了。
KernelSU 的模块系统与 Magisk 尽量保持了兼容,模块的格式也是完全一样的,因此正常情况下,如果某个模块不依赖 Magisk 的内部实现,那么它应该可以在 KernelSU 上工作。
Magisk 从诞生到到现在已经七年了,在这么长的时间里,它积累了非常丰富的功能,为了与其保持兼容,那基本上都要提供这些功能;好在我们站在巨人的肩膀上,很多功能不需要从头开始写,这节省了不少工作量。Magisk 的功能主要分为以下几部分:
MagiskSU:提供 root 访问和授权;这一点 KernelSU 在内核层面直接修改进程的 credentials 实现。
Systemless:支持对 /system 分区的修改,模块功能的基础;Magisk 使用的是 bind mount,KernelSU 使用 overlayfs;得益于 overlayfs,其实现非常简单(不过还有很多 bug...
Sepolicy:支持对 SELinux 策略进行修改;Magisk 借助 libsepol 和内核的 selinuxfs 接口完成,而 KernelSU 由于工作在内核,很自然地选择了在内核空间实现;通过直接修改运行在内核中的 SELinux 内存数据结构,直接实现了 sepolicy 的修改。
resetprop:支持修改系统属性;这一块相对比较独立,而且完全是用户态的工具;因此 KernelSU 直接把 Magisk 的 resetprop 拿过来用了。
post-fs-data 和 service 脚本:Magisk 通过直接修改 rootfs 中的 init.rc 来注入 init 事件;而 KernelSU 在内核中拦截了 init 进程对 rc 文件的读取,动态修改了返回的内容。
Zygisk:提供对 zygote 进程的注入功能;这一块 KernelSU 没有内建支持,这个功能完全可以通过模块实现,因此 KernelSU 将来也不会提供支持。现在已经有了 nu11ptr 写的 ZygiskOnKernelSU,可以作为模块在 KernelSU 中运行以支持 Zygisk 模块。
Magiskboot:提供对 Android boot image 的修改;这一块 Magisk 已经非常成熟和稳定了,完全没有必要自己造个轮子;如果以后闲的没事干,可能会用 Rust 把它重写一遍弄得玩 :)
截止现在,模块所依赖的 Systemless, post-fs-data.sh, service.sh, sepolicy.rule, resetprop 都已经支持了;虽然目前还存在很多 BUG,但理论上 Magisk 的模块可以实现的功能,在 KernelSU 也可以实现了。欢迎善于折腾的小伙伴前来尝鲜体验!
需要说明的是,KernelSU 诞生才两个月,即使已经有模块功能,但依然不够稳定,所以你遇到任何问题都是符合预期的;因此在使用之前,请注意备份好数据;如果遇到问题,请发送日志给我们;如果有能力,欢迎来帮助我们解决问题。
想体验的童鞋,可以阅读原文了解更多。
最后,必须感谢所有为 KernelSU 贡献代码的小伙伴们,你们是最棒的!
大家晚安!