拓展概览
拓展系统让启动器在不改动主程序的前提下加功能:自定义页面、批量处理实例、接第三方服务、做联机工具。
想直接开工
六个语言的模板仓库已经建好了:语言模板 —— clone 下来改个 id 就能跑,连打包脚本都不用写。
它长什么样
一个拓展就是一个文件夹(打包后是 .zip),里面至少两样东西:
text
my-ext/
├─ manifest.json 清单:id、名称、版本、运行时、入口、权限
├─ main.jar 入口程序(或 .py / .js / .exe)
└─ lib/ 依赖(可选)装到数据目录的 extensions/ 下,启动器扫一遍就会出现在「设置 → 拓展」里。
导入、权限确认、启用与卸载的具体操作见 导入与管理拓展。
启用与信任
首次加载会算整个包的 SHA-256,写进 extensions/trusted.json:
json
{
"hello-go": {
"sha": "9f2c…",
"enabled": true
}
}- 包内容变了,哈希就对不上,启动器会拒绝加载并提示「拓展已被修改」。
- 这是防篡改,不是防病毒——别装来源不明的拓展。
- 停用只是把
enabled改成false,文件不动。
生命周期
text
扫描目录 → 读 manifest → 校验字段 → 比对 trusted.json
→ 检查 runtime 是否可用 → 解压到临时目录(原生包顺带 chmod +x)
→ 启动入口进程 → 建立 stdio 通道 → 发 hello
→ 运行期收发消息
→ 退出 / 停用 → 清理临时目录拓展是独立进程,崩了不会带走启动器;启动器退出时也会把子进程一起收掉。
能做与不能做
| 能做 | 不能做 |
|---|---|
| 读写自己的数据目录 | 直接改启动器内存 |
| 通过宿主 API 读版本 / 实例信息 | 绕过权限声明访问文件 |
| 发通知、弹自定义窗口 | 静默改别人的拓展 |
| 发 HTTP 请求 | 拿到用户的登录令牌明文 |
| 启动子进程 | 在启动器进程内注入代码 |
权限
manifest.json 里声明,用户装的时候能看到:
| 权限 | 含义 |
|---|---|
fs.read | 读数据目录 |
fs.write | 写数据目录 |
net | 发网络请求 |
process | 启动子进程 |
ui | 弹窗、通知、加页面 |
launch | 触发启动游戏 |
没声明的权限调用会被宿主直接拒绝,并在日志里记一条。
体积限制
| 项 | 上限 |
|---|---|
| 单个文件 | 8 MiB |
| 整包解压后 | 16 MiB |
| manifest.json | 64 KiB |
原生运行时编译出来的二进制容易顶到上限,发布前记得 strip:
bash
go build -ldflags "-s -w" -o main.exe .
cargo build --release && strip target/release/my-ext