以前我山寨 Flash 开发工具搞了个内部用的 HTML5 动画编辑器,用户可以编辑时间轴啥的,最后导出一串动画配置数据,数据喂给动画库之后页面内的元素能够根据配置“动”起来。这个动画库是一个已离职同事基于 CSS Animation 开发的,只能线性播放。我上个月让某个新同学开发基于此的可控的动画库,希望能实现非线性播放。本来是让他想用 JS 来实现,但这位同学为了偷懒思路清奇把 animation-delay 玩出了花,最后动画控制全是靠 CSS 动画时间偏移,反正能用就没深究。最近想要把这个用到 Webvfx 上,也就是每一次 render 时跳转到传入的百分比处。但问题来了,当时编译 Webvfx 时是用包管理器安装的 QtWebKit,版本比较低,只支持 -webkit-transform,不支持 -webkit-animation,绝望。虽然可以让他再用 JS 实现一个动画控制,但考虑到以后的扩展性和挑战自己,我打算升级 QtWebKit 来支持最新的 Web 特性。

着手准备升级时发现 Qt5 有新增 QtWebEngine 模块,它是基于 Chromium 的,感觉上要比 WebKit 靠谱些,毕竟 WebKit 实现的 feature 缺了很多以及 Bug 也不少。官方的迁移文档标出的改动没有很多,看起来很诱人,所以就不知天高地厚地想要把 QtWebKit 切换到 QtWebEngine。最终不出意料地失败了,虽然文档说只有这几个点有变化,但实际修改时发现接口改动特别多,尤其是 Webvfx 依赖的 render 方法没了,目测是个深坑,趁还没陷进去就果断抽身跑路。塞翁失马,倒也是顺便略微熟悉了下 Webvfx 的代码。

为了避免包管理器版本落后的问题,直接拉源码编译。Qt5 的这篇文档写得很详细,照着安装依赖、编译。再进入 QtWebKit 编译。等了很久终于编译出来了。如果用了 -developer-build 选项就不用 make install,编译出来的文件就在 qtbase 目录下,把这个目录加到 QTDIR 和 PATH 以及 LD_LIBRARY_PATH 环境变量里让系统和其他程序能找到它们。再加一个 export QT_MAJOR_VERSION=5,Webvfx 编译时会读取。这一步是否可以直接从包管理器安装呢?没试过,想来也许可以。

再编译 Webvfx,出错提示说 libqtwebkit 缺少 qtpositioning,而 qt lib 目录没有这个 so 文件,看来是前一步 QtLocation 没有编译出来。尝试编译 QtLocation,里面依赖了 gypsy 等 GPS 定位相关的模块编译失败,折腾了很久没有解决,转而思考其他出路,考虑到我并不需要定位之类的功能,开始找禁用 WebKit 地理信息相关功能的地方,找到在 QtWebKit 源码的这个文件 Source/cmake/OptionsQt.cmake 里把 geolocation OFF 掉。再次编译 QtWebKit,又是等等等。中间作死把 DRAG 和其他一些 Webvfx 用不到的 feature 也关了,结果编译到 99% 时说找不到 DragData,简直崩溃,老老实实改回去再来一次,继续等等等。

这里我要喷一下 QtWebKit,不知道开发者发什么神经,GitHub 上 QtWebKit 的分支命名非常混乱,含有较新 WebKit 的分支叫 5.212,而不是 5.9,这不坑人嘛,我就妥妥地上当了,拉了 5.9 下来编译,哼哧哼哧搞了半天,得到个 WebKit 538,太气人了😤。项目里面的 WebKit 不是通过 git submodule 而是直接复制源码过来的,看不出哪个是新的。最后还是去看 commit 找有关 WebKit 的提交记录才确定 5.212 的代码比较新。跟 webvfx release 的包落后 master 分支 4 年有得一拼。

搞定了找不到 qtpositioning 后,Webvfx 又要 qWebview,而 QtWebview 依赖 QtWebEngine。编译 QtWebEngine 也是血泪史。看它基于 Chromium,编译起来肯定也不轻松,但 Ubuntu 16 的包管理里没有 lib5webengine5,到了 Ubuntu 18 才有,我也不敢这个时候升级系统呀,愁啊只能自己编。顺便说一句,Ubuntu 18 里面的 libqt5webkit5 是 5.212 的,到时候应该可以直接用,不用自己编译了。编着编着吧出问题了,磁盘没空间,好 加硬盘空间继续,报 g++ internal error,查到有个 GitHub Issue 里说可能是内存不够,加到 16G 内存,老老实实不敢开并发,就这么编,等了大半天——字面意义上的——终于编出来了。再编译 QtWebview 倒没什么问题了,最后终于编译成功了 Webvfx。试了下确实支持 CSS Animation 了,UserAgent 显示内核是 WebKit 602.1,还算新。至此,大功告成。

给一点建议,如果你也要这么搞的话,要留足硬盘空间,编译时会产出大量文件,我就是因为一开始新建云服务器时空间留得不够,后面又补了个云磁盘。墙内的服务器拉 GitHub 代码太慢了,可以先拉到本地,打成 Tar 包后再 ftp 到服务器上。建议使用 git clone 而不是下载来拉源码,这样如果编译过程中要重置文件夹,执行 git clean -xdf 就可以了。土豪可以上 Google Cloud 的机器,直接拉 GitHub 代码特别特别快,缺点就是贵。

最后感谢 @Jitloth 对我上述工作给予的无私支持。

附:空间使用情况(略去了不满 1G 的):

52G     qt5
2.4G    qt5/qt3d
8.7G    qt5/qtbase
2.1G    qt5/qtdeclarative
1.1G    qt5/qtmultimedia
1.8G    qt5/qttools
19G     qt5/qtwebengine
13G     qt5/qtwebkit