为什么我要用 Rust 重写 FluxDown
§ 01
先说句实话:FluxDown 的 Flutter 版本确实能跑,也帮很多人完成了无数次下载。但每次打开它,我都知道,它离我心中的“下载器”还差一步。
它的界面和下载引擎被塞进同一个进程,靠 FFI 信号桥通信。界面一出问题,正在进行的下载也跟着崩溃。
多窗口是另一堵墙。桌面端的 Flutter 没有真正的多窗口能力:设置、队列管理、任务详情全得挤在主窗口里做成对话框。光是一个小小的快速下载窗口,我就得在每个平台写原生宿主——Windows 用 C++、macOS 用 Swift、Linux 用 C——再嵌进第二套完整的 Flutter 引擎,还得通过消息通道和主窗口保持同步。
最让我难受的是内存。那个小窗口一旦创建引擎,就再也无法销毁——反复创建销毁只会崩溃——所以它只能赖在内存里,直到应用退出。而为了后台继续下载,整个 Flutter 界面都得常驻内存,哪怕你一整天没碰过它。
开发节奏也拖慢了。加个按钮,得写 Rust 信号、生成 Dart 绑定、再写一遍 Dart 模型——同一件事,两种语言写两遍。时间都花在来回搬数据上,而不是打磨你每天盯着看的那个窗口。
于是我不再打补丁,从零开始:整个桌面客户端,用纯 Rust 原生 UI 重写。
我想要的下载器是那种几乎无感的:打开时它在,关掉时它还在那跑,从不碍事。
§ 02
为什么选 GPUI
GPUI 是 Zed 编辑器背后的 Rust UI 框架;它直接在 GPU 上绘制界面。没有 WebView,没有 Electron,没有第二门语言——从下载引擎到屏幕上的每个像素,现在都是一套 Rust 代码。
这意味着更少的层、从点击到结果更短的路径,以及 macOS、Windows 和 Linux 上的原生窗口。它不是塞进壳里的网页。它是一个本该待在桌面上的应用。
多窗口在这里是一等公民。设置、队列管理、任务详情和进度窗口都是真正的原生窗口,共享同一个进程和一套实时状态——想开多少个都行,关掉一个就真的释放了。
§ 03
新架构:下载与界面彻底分离
这次重写最重要的决策,你看不到,却影响深远:FluxDown 现在拆成了三个进程,各司其职。
- 01
fluxdown-desktop界面只负责画界面。按需启动,关掉就退出——后台不留任何东西。
- 02
fluxdown-agent网关常驻运行,支撑托盘、浏览器捕获、剪贴板、云同步和本地 API。
- 03
fluxdownd下载核心掌管引擎和数据库:任务、队列、计划、RSS、插件和 webhook。
效果立竿见影。关掉窗口,下载照常进行;再打开,实时状态瞬间恢复。关闭最后一个窗口后,界面进程会完全退出,把内存全部归还系统——常驻的只剩网关和下载核心,没有任何 UI 运行时。无论界面进程出什么问题,都碰不到正在下载的文件。而且核心与界面之间使用统一的协议,NAS 上的 Web 控制台从此拥有了和桌面客户端完全一致的能力。
§ 04
新界面:每个角落都重新打磨
除了架构,我还逐像素重做了界面。以下是我最喜欢的几处改动:
命令面板 按 ⌘K / Ctrl+K,所有操作和设置一搜即达。支持模糊匹配,常用的自动置顶。 真正的多窗口 设置、队列管理、任务详情和单任务进度窗口都相互独立,还会记住各自的位置和大小。 看得见的文件 任务列表显示系统文件图标。双击打开,下载完成的文件可以直接拖出窗口(macOS / Linux Wayland),文件被移动或删除也会立即标记。 读得懂的速度 任务详情新增「来源构成」和「速度」页面,清晰展示每个 CDN、代理、网卡各贡献了多少。 稳定不抖动的列表 进度更新时行序保持不变,再长的任务列表页面也依然流畅。 重写的主题 采用声明式 token 格式,对比度天然保证可读性——可以在本站的主题编辑器里打造你自己的配色。§ 05
不止桌面端
地基已经打好,我把家族里的其他成员也带到了同一起跑线上。
全新的 Web 控制台:NAS/服务器端的 Web 控制台被从头重写,布局和操作与桌面端客户端完全一致。
多设备支持:可将任务发送至云端设备或局域网内配对设备;直连局域网配对时会通过简短的安全码进行确认。
多网卡下载:聚合多块网卡以加速单个下载;自动代理模式现在支持并行调度多条路径。
修复旧疾:一长串修复列表:HTTP 断点续传检查、HLS/DASH 静默输出、大于 4 GB 的 ED2K 文件、BT 暂停竞争条件、队列调度等。
更静、更快:空闲状态的 FluxDown 不再唤醒睡眠的 NAS 磁盘,冷启动也更快,窗口等待时间更短。
§ 06
升级前须知
你的任务、历史和设置都存储在同一个本地数据库中,升级后它们依然完好。在 Windows 上,安装程序会就地升级旧版 Flutter 版本,并自动将文件关联以及磁力/ED2K 链接指向新客户端。
有几点值得注意:
- 局域网配对协议现为 v2 版本 — 请同时升级两台设备。
- 已保存的网站凭据需要重新输入一次。
- 请同步更新浏览器扩展和桌面应用,否则可能出现“未连接”的状态。
- Windows 版本目前未签名,首次启动时系统可能会发出警告。
- Android 应用仍基于 Flutter 构建,并持续接收引擎更新。
§ 07
最后,谢谢
重写一款已经正常运行的软件,既冒险又孤独。支撑我走到最后的,是每一个 issue、每一张选票,以及每一句“这很棒”。
FluxDown 依然免费、开源且无广告。如果新界面让你会心一笑,请告诉我。如果哪里感觉不对劲,请更直接地告诉我 — 你来决定下一个版本的走向。
— FluxDown 作者
获取新版本 发送反馈 赞助 FluxDown