Spotube 中文文档 下载 App

Spotube 插件加载失败——从 .smplug 到 Zipline 沙箱的排查

症状分类

Spotube 插件加载失败的表现:

表现可能原因
插件页"可用插件"里能看到,但 "Install" 后没反应.smplug 下载损坏 / 路径权限
插件在"已安装"里,但开关一打就红并报错plugin.json manifest 格式错误 / 接口签名不匹配
启用后 Spotube 立即闪退插件 main() 函数崩溃(空指针 / Bridge 调用失败)
启用成功但搜索/播放调用不到插件注册的接口没有对应实现
运行时偶发崩溃插件 HTTP 请求异常 / Zipline 沙箱内存不足

排查步骤

1. 确认插件文件完整

插件目录里找到 .smplug:

2. 确认版本兼容

plugin_interfaces 版本必须匹配 Spotube 主版本:

Spotube 版本兼容的 plugin_interfaces 版本
v5.0.x5.0.x
v5.1.x5.1.x

v5.1 新增了几个接口方法(比如 AudioAPI 新增了 FLAC codec 声明),v5.0 的插件直接装到 v5.1 上大概率会出问题。反过来 v5.1 的插件装到 v5.0 上也会因为旧版宿主缺少新 Bridge 方法而崩溃。

解法:让插件作者发布对应版本的 .smplug;或在 Spotube 上先装匹配版本的插件。

3. 看 debug log

Spotube 设置 → Debug → Export debug log。插件加载成功和失败的日志都会出现在里面,关键字:

4. 开发者模式(桌面端)

spotube --developer-mode

开发者模式会在 Spotube 里显示:

5. 用示例插件验证宿主没坏

Spotube 仓库的 js_plugin_example/ 里有一个最小示例插件。编译它:

git clone KRTirtho/spotube
cd spotube/js_plugin_example
./gradlew spotubePlugin
# 得到 my-plugin-1.0.0.smplug

把这个最小插件装到 Spotube。如果这个也加载失败 → 问题在你的 Spotube 安装或系统环境(不是你想装的那个插件)。如果这个能加载 → 问题在那个插件本身(版本 / 代码)。

常见 .smplug 问题

plugin.json 格式错误

plugin.json 必须是合法 JSON,且包含 id / version / name / abilities 字段。少任何一个 Spotube 加载时都会报 "Invalid plugin manifest"。

abilities 字段声明了但接口没实现

plugin.json 里写了 "abilities": ["audio"],但插件 main() 里只注册了 MetadataSearchAPI → Spotube 以为它有 AudioAPI 能力,调用时崩溃。

index.zipline.js 不是有效 Zipline bundle

有些插件作者忘了用 spotube-gradle-plugin 打包,自己手动把 Kotlin/JS 编译产物扔进去 → 缺少 Zipline 初始化代码,加载失败。

插件需要的 Bridge 能力 Spotube 版本没有

比如插件用了 Spotube v5.1 才有的 AudioAPI codec 声明,但你还在 v5.0 → Bridge 找不到对应方法,崩溃。

插件卸载 / 重装

完全移除插件

  1. Spotube 插件页 → 开关关掉 → 点删除按钮
  2. 手动去插件目录把 .smplug 文件删掉(Spotube 有时没清干净)
  3. 重启 Spotube

强制重装

向插件作者反馈问题

带这些信息提交 Issue / Discord 消息:

  1. Spotube 版本号(精确到 nightly build date,如果是 nightly)
  2. 插件版本号
  3. 你的操作系统和版本
  4. debug log 里 "plugin" 和 "Exception" 关键字附近的内容
  5. 复现步骤(精确:装了什么、点了什么、报了什么错)