可用于为 Unity IL2CPP Android 游戏开发内置 Mod 菜单。提供 Rust il2cpp hook、egui 原生菜单、Kotlin JNI 桥接与 CLI 脚手架,支持从 APK 初始化、构建和安装。【此简介由AI生成】
当前访问频次受限,请登录后继续访问
menu
Android Unity(IL2CPP)游戏内置修改菜单(mod menu)工具链:Rust + egui 渲染原生悬浮菜单, 通过 il2cpp hook 读写游戏内存,Java/Kotlin 侧仅负责 Surface 与输入桥接。
其中游戏业务实现(rust/menu,独立 workspace)不发布;其余四个 crate 已发布到
crates.io,可用于任何 Unity IL2CPP 游戏的同类开发:
| crate | 说明 |
|---|---|
il2cpp_utils |
il2cpp 绑定运行时:7 个过程宏生成类/字段/方法绑定,dobby hook,集合镜像,GC 写屏障 |
il2cpp-utils-macros |
上述过程宏的实现(#[il2cpp_class] 等 7 个) |
menu-ui |
Android 内置菜单框架:EGL/egui 渲染、JNI 输入桥接、原生文本框与图片选择 |
menu-utils |
脚手架 CLI:init 把 APK 变成可构建的 Gradle + Rust 工程,build / run 构建安装启动 |
架构
┌────────────────────────── 安装到手机的 APK ──────────────────────────┐
│ 游戏(Unity libil2cpp.so、assets、res、游戏 so —— 原样保留) │
│ lib<mod>.so Rust 侧:菜单业务(menu) + menu-ui + il2cpp_utils │
│ egui-bridge.jar Kotlin 桥接:EguiInitProvider 自动 attach、 │
│ SurfaceView/EGL 表面、触摸路由、选图/文本框 │
│ classes*.jar 游戏 Java 层(dex 经 d2j-dex2jar 转回 class jar) │
└──────────────────────────────────────────────────────────────────────┘
↑ gradle assembleDebug/Release(AGP 9.2.1 + Gradle 9.8)
menu-utils init / build / run
↓ cargo ndk(aarch64-linux-android)
rust/ 工作空间:menu-ui + il2cpp_utils(+macros) + menu-utils(本 CLI)
(menu 为游戏业务 crate,独立 workspace,不入 crates.io)
运行链路:游戏启动 → EguiInitProvider(ContentProvider,首个 Activity 恢复时自动触发)
→ System.loadLibrary(<mod库名>) → Rust JNI_OnLoad → il2cpp_utils::init 等
libil2cpp.so 加载后挂全部 hook;menu_ui::init 在独立 EGL SurfaceView 上跑 egui 主循环,
触摸事件经 TouchRouter 分流(菜单手势 vs 游戏点击)。
目录结构
├── android/ # Gradle 工程(Gradle 9.8 + AGP 9.2.1)
│ └── egui-bridge/ # 桥接库 Kotlin 源码;构建后从 AAR 抽出
│ # egui-bridge.jar(随源码提交,menu-utils 内嵌同款)
├── rust/ # cargo 工作空间
│ ├── il2cpp_utils/ # 绑定运行时 + macros/(已发布)
│ ├── menu-ui/ # 菜单框架(已发布)
│ ├── menu-utils/ # 脚手架 CLI(已发布)
│ └── menu/ # 游戏业务 crate(独立 workspace,不发布,已忽略)
└── publish.bat # 四个 crate 发布到 crates.io(幂等)
快速开始(新游戏 / 新工程)
环境要求(PATH 可用):JDK 17+、Android SDK + NDK、cargo-ndk、apktool、
d2j-dex2jar(dex-tools)、adb;Rust target aarch64-linux-android。
rustup target add aarch64-linux-android
cargo install menu-utils
mkdir my-mod && cd my-mod
menu-utils init <游戏.apk> mymenu # 解包 APK → target/android + 当前目录 Rust 项目
menu-utils build # cargo ndk 出 libmymenu.so → gradle 出 APK
menu-utils run # 增量构建 + adb 安装 + 启动游戏
init生成物:target/android/(游戏 manifest/res/assets/jniLibs,游戏 dex →jar/classesN.jar,注入 egui-bridge 组件与com.wuyan.egui.LIB_NAMEmeta-data) 和当前目录的 Rust 项目(依赖 crates.io 的menu-ui = "0.1",写你的菜单 UI);- 已初始化的工程重复
init不会覆盖你的 Rust 代码;--release构建用 debug 签名可直接安装。
发布新版本
改 publish.bat 顶部 VERSION(与各 Cargo.toml 一致)后运行 publish.bat;
需要先 cargo login 并在 crates.io 完成邮箱验证。menu-ui / il2cpp_utils 因依赖
Android-only 库(ndk-sys / dobby)在脚本内以 --no-verify / --no-default-features
验证,Android 编译以 cargo ndk check 为准。
License
MIT OR Apache-2.0