内容提要
作者在受限WebView(Chrome 61基线)环境下,用统一网页壳开发了六款离线小工具,总计583,270字节。核心策略是删减禁用API、控制体积,并进行严格合规与触摸审计。其中掌机合集42KB含8款游戏,暗房通过离线烘焙3D LUT实现胶片模拟,日历固化38场活动数据。文中还记录了搜索竞态、EXIF重复旋转等真实bug及许可规避做法。目前仅在模拟环境验证,尚未真机实测。
延伸解读
受限环境下的开发取舍
文章展示了在Chrome 61基线的WebView中,开发者必须禁用fetch、Worker等现代API,并控制体积在10 MiB内。这迫使团队优先删减功能而非增加功能,例如暗房将光谱积分离线烘焙为3D LUT,运行时仅查表。这种“构建期换运行时”的策略,是资源受限场景下的典型权衡,但代价是牺牲了动态性和部分精度。
合规与许可的实操细节
作者在选材时规避了俄罗斯方块、马里奥等商标风险,依据“玩法不受著作权保护”重写代码,并在license.json中记录商标注册号和规避方式。对于GPL-3.0的暗房,则需在产物中写明来源和许可,并自行提供源码地址。这些做法提示读者:在分发工具时,许可合规与功能实现同等重要,且需提前规划。
测试验证的边界与局限
文章详细记录了自动化审计(如2932项触摸检查)和独立评审(日历从7.5分整改到8.3分),但也明确承认所有验证仅在模拟环境完成,未进行Chrome 61和Android 8.1真机实测,性能未知。这提醒读者:模拟环境下的“0失败”不等于真机可靠,尤其是触摸响应和渲染性能,需以实际设备为准。
Q&A
这六个离线小工具是在什么运行环境下开发的?有哪些限制?
运行在受控 WebView 中,最低基线是 Android 8.1 出厂的 Chrome 61,语法上限 ES2017。禁用 fetch、XMLHttpRequest、WebSocket、Worker、WebAssembly 等 Web API,CSS 的 flex gap、clamp()、aspect-ratio、:has()、dvh 也不能用。体积上限 10 MiB,建议 2 MiB。
八合一掌机合集是如何把 8 款游戏塞进 42KB 的?
将规则和视图拆开:纯规则挂 window.MinitoolGames,视图是 window.MountX 只做渲染和输入。规则能在 Node 里裸跑,不碰 DOM。源码约 154 KB,压缩后 42,824 字节。有 72 个规则用例和 88 个 DOM 冒烟用例验证。
暗房工具是如何在 Chrome 61 中实现胶片模拟的?
运行时不做光谱积分,而是离线烘焙:21 卷负片、8 种相纸烘成 29 张 17³ 的 3D LUT,烘焙耗时 3.4 秒。运行时只查两次表。渲染分三段:胶片 LUT、四分之一分辨率的高光模糊、相纸 LUT 加颗粒和暗角。WebGL 不可用时降级到 Canvas 2D 逐像素查表。
上海日历的数据是怎么来的?为什么没有图片?
因为没有可用的公用 API 且容器不许联网,数据在构建期抓取并人工核验后固化进 data.js,共 38 场活动(25 场展览加 13 场市集),每条带来源和核验日期。海报是运行时按 id 哈希生成的内联 SVG,6 种构图乘每类 4 套配色,零外部素材,包体仅 31 KB。
开发过程中遇到了哪些真实的 bug?如何修复的?
四个主要 bug:1) 日历搜索竞态:清除按钮没清定时器,140ms 防抖窗口内点×会回填旧查询,补 clearTimeout 修复;2) 图片方向:手动解析 EXIF 再转一次导致反向旋转,改为不读也不改写方向,只做等比缩放;3) 扫描器误判:base64 数据中的 123n 被当成 BigInt,修法是先剥掉字符串字面量再扫语法;4) 打包误杀:暗房的 assets/ 被误判为目录包裹层,判据改为 zip 根层必须直接有文件。
这些工具在版权和许可方面做了哪些规避?
砍掉了俄罗斯方块、Flappy Bird、超级马里奥、吃豆人、太空侵略者等有商标或角色权利的游戏。依据法条:游戏规则、机制属于思想不受著作权保护,受保护的是代码、美术、音乐等。所以玩法可以重写,但代码和画面全部原创。2048 按 MIT 参考重写并保留声明;贪吃蛇是公共领域玩法加原创代码;其他游戏用中文通用名或自拟标题,license.json 里逐条记录商标注册号和规避方式。暗房是 GPL-3.0,产物中放 license.json 写清来源、许可和实现说明。
这些工具目前验证到什么程度?还有哪些未完成?
目前仅在模拟环境(CDP 模拟)中验证,Chrome 61 和 Android 8.1 未实测,性能未实测,六个 zip 未上传创服平台,也未跑过 Android 和 iOS 真机。作者计划按从小到大的顺序上传,每个先过平台模拟器再扫码上真机。日历数据是 11 月 2 日的快照,下个月需重新抓取。