Skip to content

拓展概览 ​

拓展系统让启动器在不改动主程序的前提下加功能:自定义页面、批量处理实例、接第三方服务、做联机工具。

想直接开工

六个语言的模板仓库已经建好了:语言模板 —— 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.json64 KiB

原生运行时编译出来的二进制容易顶到上限,发布前记得 strip:

bash
go build -ldflags "-s -w" -o main.exe .
cargo build --release && strip target/release/my-ext

下一步 ​