https://github.com/udochina/KPM-Build-Anywhere/ 项目提供了用ndk构建的思路
- 本项目在此项目上使用cmake,更便捷的包管理工具
- 自动拉取kernelpatch源码,自动生成相关模板
- 进一步支持ide的智能提示,智能索引,让开发者动一下手指就能完成内核模块编译
- 一般用户可以直接完成构建,如果出现构建失败请看排查指南,提出issues,作者会不断完善
- 此项目是为了https://github.com/jiqiu2022/Zygisk-MyInjector的内核隐藏做的一个便捷脚手架
注意:从别的项目反馈来看 貌似不同的kpm版本加载有符号问题,请注意好手机的Apatch是否和当前项目自动拉取源码的版本是否相同,本项目默认拉取最新的源码来构建
# macOS / Linux
./build.sh
# Windows
build.bat
# 输出文件位于: build/<模块名>/<模块名>.kpm# macOS / Linux
./build.sh
cmake --build build --target hello
# Windows
build.bat
cmake --build build --target hello# macOS / Linux
./new-module.sh my-module "Your Name" "My awesome module"
# Windows
new-module.bat my-module "Your Name" "My awesome module"KPM-Build-Anywhere/
├── modules/ # 模块目录
│ ├── hello/ # 示例模块
│ │ ├── module.c # 模块源码
│ │ └── module.lds # 链接脚本(可选)
│ ├── template/ # 模块模板
│ │ ├── module.c
│ │ └── module.lds
│ └── your-module/ # 你的模块
│ └── module.c
├── build/ # 构建输出(自动生成)
│ ├── hello/
│ │ └── hello.kpm # 编译后的模块
│ └── your-module/
│ └── your-module.kpm
├── third_party/ # 第三方依赖(自动下载)
│ └── KernelPatch/ # KernelPatch 源码
├── build.sh # 构建脚本 (macOS/Linux)
├── build.bat # 构建脚本 (Windows)
├── new-module.sh # 创建模块脚本 (macOS/Linux)
├── new-module.bat # 创建模块脚本 (Windows)
├── env.example # 环境配置示例
└── CMakeLists.txt # CMake 配置
# 创建新模块
./new-module.sh my-awesome-module "Your Name" "Description"
# 编辑模块代码
vim modules/my-awesome-module/module.c
# 构建
./build.sh-
复制模板
cp -r modules/template modules/my-module
-
编辑源码
- 修改
modules/my-module/module.c - 更改模块名、作者、描述等信息
- 实现你的功能
- 修改
-
构建
./build.sh
-
输出
- 编译后的文件:
build/my-module/my-module.kpm
- 编译后的文件:
// 1. 模块名(必须唯一)
KPM_NAME("kpm-your-module");
// 2. 版本信息
KPM_VERSION("1.0.0");
// 3. 许可证
KPM_LICENSE("GPL v2");
// 4. 作者
KPM_AUTHOR("Your Name");
// 5. 描述
KPM_DESCRIPTION("Your module description");
// 6. 回调函数
static long your_init(const char *args, const char *event, void *__user reserved) {
pr_info("Module loaded\n");
return 0;
}
static long your_exit(void *__user reserved) {
pr_info("Module unloaded\n");
return 0;
}
// 7. 注册回调
KPM_INIT(your_init);
KPM_EXIT(your_exit);# 复制配置模板
cp env.example .env
# 编辑配置
vim .env配置示例:
# NDK 路径(可选,不设置则自动检测)
NDK_PATH=/Users/yourname/Library/Android/sdk/ndk/23.1.7779620
# KernelPatch 源码(可选,不设置则自动下载)
KP_DIR=/path/to/KernelPatch
# 并行编译任务数
BUILD_JOBS=4# 构建所有模块
./build.sh
# 清理构建
./build.sh clean
# 详细输出
./build.sh --verbose
# 指定并行任务数
./build.sh -j8# 配置项目
cmake -B build
# 构建所有模块
cmake --build build
# 构建特定模块
cmake --build build --target hello
# 清理
rm -rf build
# 详细构建日志
cmake --build build --verbose
# 并行构建
cmake --build build -j8原因: modules/ 目录下没有有效模块
解决:
# 检查模块目录
ls -la modules/
# 创建新模块
./new-module.sh my-module解决:
# 方法 1: 设置环境变量
export NDK_PATH=/path/to/your/ndk
./build.sh
# 方法 2: 使用 .env 文件
echo "NDK_PATH=/path/to/your/ndk" > .env
./build.sh检查清单:
- 确保
module.c存在 - 检查语法错误
- 查看构建日志:
./build.sh --verbose - 确认 KPM API 使用正确
解决:
- Tools → CMake → Reload CMake Project
- 检查 CMake 输出,确认模块被识别
- 重启 CLion
# 1. 创建模块
./new-module.sh hello-world "John Doe" "A simple hello world module"
# 2. 编辑代码
# modules/hello-world/module.c 已经基于模板创建好了
# 3. 构建
./build.sh
# 4. 或者只构建这个模块
cmake --build build --target hello-world
# 5. 输出文件
ls -lh build/hello-world/hello-world.kpmKPM_NAME(name)- 模块名称(必须唯一)KPM_VERSION(version)- 版本号KPM_LICENSE(license)- 许可证KPM_AUTHOR(author)- 作者KPM_DESCRIPTION(desc)- 描述
KPM_INIT(func)- 模块加载时调用KPM_EXIT(func)- 模块卸载时调用KPM_CTL0(func)- 控制函数 0KPM_CTL1(func)- 控制函数 1
pr_info()- 打印信息pr_err()- 打印错误compat_copy_to_user()- 复制数据到用户空间compat_copy_from_user()- 从用户空间复制数据- 更多的请参考KernelPatch docs
GPL v2 or later
- KPM-Build-Anywhere - 灵感的来源
- KernelPatch - 强大的内核补丁框架