项目起源

这还要从我在 2021 年买了一块便携屏说起,PPI 347(13.3’ 4K)无论是外接 Switch 还是当作开发时的副屏,显示效果都非常棒,一直想让它派上更多的用场。

新发现

一次在外接安卓系统的 GoogleTV 给 RetroArch 导入 ROM 包时,由于要调整文件目录,就随机下载了一些文件管理器。

其中一款名为 X-plore 的应用有一个“无线文件共享”的功能,可以直接在浏览器里管理设备上的文件,十分方便:

screenshot

这一下子就吸引了我的注意,因为我平时更偏向于在使用 Mac 的同时使用安卓手机,而在这两者之间传输文件一直是件尴尬的事情。

先前我曾使用过老罗深受好评的 SmartFinder,但它不得不在电脑和手机各安装一个客户端,作为一名 Web 开发者,我真的不喜欢太多的安装。
后来,当我发现安卓官方也有适配 Mac 的驱动时,就立马卸载了 SmartFinder。虽然驱动难看又难用,还得插线,但对我来讲,客户端装一个总好过装俩,也不必给每个安卓设备都装上。

优化之路

经过一段时间的使用,产生了优化这个界面的想法。

1. 浏览器插件阶段

直接通过现有的浏览器代码注入插件,对其进行了样式覆盖,设为全屏显示并替换了图标:

override

但第三方的插件只能绑定固定的源,一旦变更 IP 或切换端口号就无法生效,且不能在多台电脑上同步。

遂将代码迁移到自己的浏览器插件中,通过一定的规则来判断,在有 Git 的电脑上可以同步。

2. 反编译调整阶段

那没有安装 Git 的电脑该怎么办呢?能不能直接将代码放进 apk 里?

粗略学习了下安卓的反编译,好像也没有那么困难。

又尝试优化了一些内部的 JS 代码,重新编译、安装、运行,现在,忘掉浏览器插件吧!

3. 反编译重写阶段

原有代码是用 jQuery 编写的,整体的可读性不高,还有一些 bug,比如 hasChildren 字段返回的值并不准确。

几番调整,发现已经开始报错,无法正常运行了。

如此一来,我只好放弃对其继续改造。保留服务端接口部分,然后改用 React 来重写前端部分。

我建立了新的仓库,使用了模拟桌面系统的界面设计,将其命名为 WFMS (Web File Management System),开启了新一轮的开发阶段。

可以说这是一个融合了 macOS 布局、Windows 壁纸和 MIUI V5 图标的“系统”:

wfms

4. 完全独立阶段

随着开发过程的不断深入,发现了一些新的问题:

也产生一些新的想法:

我想到了自己常用的一个 NPM 包 “Anywhere”,全局安装并以命令行的形式运行,就可以在浏览器中访问执行目录的文件,但也只能以简单的页面交互读取文件。

Anywhere 在 Termux 上能够正常地运行,那我能不能效仿它的方式,做一个功能更丰富的 Package 呢?

这样我就可以卸载掉 X-plore,而且随意篡改他人的 App 似乎也不太礼貌。

研究一番 Anywhere 的源码,试学了 NestJS 的网络课程,我决定不再在 apk 上下功夫,重新开始吧!

用 NestJS 来开发服务端,与之前的前端工作融合起来(你会发现 GAGU 仓库最初的前端代码是从 WFMS 仓库 迁移而来),构建并发布自己的 NPM 包,运行在所有支持 Node.js 的设备上!

项目名称

当我计划将项目完全独立出来时,想到得给它重新取个名字,因为 WFMS /ˈdʌbəlju-ɛf-ɛm-ɛs/ 念起来还是太长了,以后向别人介绍时难免拗口万分。

最好只有两个音节,字母还要少一些,对应的 NPM 包名和域名也不能被注册。

这真的有些不太好取,正当我为此而烦恼时,我那一岁多的小女儿给了我灵感,她最近总是不停地嘟囔着一种类似 /'gʌgu/ 的声音(首页顶部的发音系其本人贡献😜),我们都不解其义。

我随即去检索了 ‘GAGU’,都还没有被注册,太棒了!

这就是 GAGU 项目名称的由来。

默认端口号和默认账号的密码都是 9293,一是因为 9293gagu 看起来很像,二是由于我跟宝妈分别出生于 1992 年和 1993 年。

GAGU 的名称只有两种书写格式:“GAGU” 和 “gagu”,前者用于文本叙述,后者用于代码之中。

← Previous

GAGU 是?

Next →

使用