news 2026/10/14 18:15:56

JSON拼写错误如何毁掉一次发布?Obtainium Emulation Pack校验体系validate-json.py深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JSON拼写错误如何毁掉一次发布?Obtainium Emulation Pack校验体系validate-json.py深度解析

【免费下载链接】Obtainium-Emulation-Pack

An Obtainium import file containing an Android emulation pack

项目地址:https://gitcode.com/gh_mirrors/ob/Obtainium-Emulation-Pack
点击查看免费下载

Obtainium Emulation Pack 是一个把主流 Android 模拟器应用打包成 Obtainium 导入文件的项目,它靠 src/applications.json 这一个数据文件驱动整个发布流程。而 scripts/validate-json.py 正是守护这份数据的质量门禁——它能在发布前揪出 JSON 拼写错误、缺失字段和重复应用 ID,避免一个字母的笔误毁掉整次发布。

一个字母的代价:拼写错误为什么这么危险 🧨

这个项目的数据文件里,每个应用都带有一个可选的meta对象,用来控制"这个应用是否进入标准版/双屏版发布包、展示名怎么显示"。以 src/applications.json 中的 Cemu 为例:

"meta": { "includeInDualScreen": false }

这行配置的意思是:标准版 Cemu 不出现在双屏版发布包里。看起来很简单,但如果你不小心把它写成includeInDaulScreen或inlcudeInDualScreen……

没有任何报错。

JSON 语法完全合法,脚本照常运行,只是配置被静默忽略——双屏用户会看到本该排除的 Cemu 混进他们的发布包,与另一款同 ID 的 Cemu 分支互相冲突,导入直接失败。这类错误肉眼审查几乎不可能发现,直到用户反馈才暴露。

这正是 RELEASE.md 中 v7.0.0 版本要解决的核心问题:

添加一个新应用意味着手工编辑 applications.json,复制模板配置,然后祈祷自己没有引入拼写错误。

校验体系全景:validate-json.py 检查什么 🔍

validate-json.py 的结构非常清晰,整个校验由三层防线组成:

第一道防线:必填字段与类型检查

每个应用必须有 4 个字段,这是 validate-json.py 中的硬性要求:

字段作用
idAndroid 包名,如info.cemu.cemu
url应用源码仓库地址
author开发者
name应用名称

同时还会检查categories必须是列表类型——写成字符串而不报错,会让后续的表格生成脚本直接崩溃。

第二道防线:meta 键白名单

项目只接受 6 个合法的meta键:excludeFromExport、excludeFromTable、nameOverride、urlOverride、includeInStandard、includeInDualScreen(见 validate-json.py)。

出现白名单之外的键,立刻报错并贴心地提醒你:

Cemu: unknown meta key 'exludeFromExport' (typo?)

注意那个(typo?)——脚本设计者早就预判了你可能会手滑。

第三道防线:内置拼写纠错表

更巧妙的是,脚本维护了一张"已知错误拼写 → 正确拼写"的映射表(validate-json.py):

typo_checks = { "exludeFromExport": "excludeFromExport", "exludeFromTable": "excludeFromTable", "nameOveride": "nameOverride", "urlOveride": "urlOverride", }

这四个拼写错误显然是从真实历史事故中收集来的。命中后报错信息会直接给出正确写法,你不需要翻文档:

Cemu: typo in meta key 'nameOveride', should be 'nameOverride'

从"发现问题"到"如何修复"一步到位——这是非常贴心的工程实践。

第四道防线:重复 ID 检测

Obtainium 的规则是:同一发布包内,两个应用的 Android 包名(id)不能相同,否则导入时互相覆盖。

本项目支持standard(标准版)和dual-screen(双屏版)两个变体,像 Cemu 这类应用会同时存在"标准版"和"双屏专用分支"两条记录,且包名完全相同。因此 check_duplicate_ids 函数会按变体分别检查:

  • 先根据excludeFromExport、includeInStandard、includeInDualScreen过滤出该变体实际会导出的应用
  • 再在过滤后的集合里找重复 ID

这样"两个 Cemu 各进各的包"是合法的,而"两个 Cemu 都进标准版"会被立刻拦下:

Duplicate ID 'info.cemu.cemu' in standard variant: 'Cemu' and 'Cemu'

这套过滤逻辑与 scripts/utils.py 中真正生成发布包时使用的 should_include_app 函数遵循同一套优先级规则,保证了"校验时的预期"和"实际导出的结果"完全一致。

如何运行校验:make validate 最快上手 ⚡

校验脚本本身只需一行命令:

python scripts/validate-json.py src/applications.json

但推荐走 Makefile 封装好的入口,一条命令搞定:

make validate

输出只有两种结局:

  • Validation passed: 40 apps checked—— 全部通过
  • Validation failed with 2 error(s):—— 逐条列出所有问题,且一次全列出来,不用改一个跑一次

它在发布流水线中的位置 🏭

单独跑校验只是第一步。看 Makefile 中的release目标就明白了:

release: validate readme minify minify-dual-screen

完整发布顺序是:

  1. validate—— 先校验 src/applications.json
  2. readme—— 生成 README 应用表格(依赖 pages/table.md 等页面)
  3. minify—— 生成标准版发布文件 obtainium-emulation-pack-latest.json
  4. minify-dual-screen—— 生成双屏版发布文件 obtainium-emulation-pack-dual-screen-latest.json

注意校验排在最前面:只要 JSON 有问题,后续的压缩导出、README 生成统统不会执行。这就是"先守门、再生产"的经典流水线设计——scripts/minify-json.py 这类生产脚本因此永远只拿到干净的数据。

给贡献者的 3 条建议 ✅

  1. 提交前必跑make release:这是 pages/development.md 中"Pre-Commit Checklist"的第一要求,它能同时完成校验 + 重新生成全部发布文件。
  2. 加应用优先用make add-app:交互式命令行会自动填好id、url、author、name四个必填字段和标准 Obtainium 配置,从源头杜绝手写 JSON 的拼写风险。
  3. 遇到校验报错别慌:报错信息已经写明了错误类型(missing required field / unknown meta key / typo / Duplicate ID)和涉及的应用名,照着改即可;不确定某个meta字段的含义时,查阅 pages/development.md 的 Meta Field Reference 表格。

总结

validate-json.py 虽然只有一个百余行的脚本,却示范了完整的质量防护思路:必填字段守结构、白名单守边界、纠错表守细节、按变体查重守业务规则,并且嵌入发布流水线作为第一道闸门。它证明了:对付"静默失败"最好的方式,是让错误在本地构建时就大声报错。

【免费下载链接】Obtainium-Emulation-Pack

An Obtainium import file containing an Android emulation pack

项目地址:https://gitcode.com/gh_mirrors/ob/Obtainium-Emulation-Pack
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 18:15:52

KingbaseES指定备份集恢复实战:备份集选择、命令与避坑指南

早上九点,我刚倒完咖啡坐回工位,值班同事的电话就打过来了:某业务库的核心订单表被一条跑错的清理脚本误清了,波及到近两天的业务数据。说实话,当时我心里没太慌,因为这个库每天凌晨都做全量备份&#xff0…

作者头像 李华
网站建设 2026/10/14 18:15:29

STM32信号发生器实战:DDS原理、DAC硬件与嵌入式代码全解析

简介:面向嵌入式开发与电子设计学习者的STM32信号发生器完整工程,基于STM32单片机实现三角波、正弦波与方波的信号生成,涵盖数字信号处理算法、HAL库驱动及Altium Designer原理图与PCB布局,适合入门到进阶的开发者参考电路设计、代…

作者头像 李华
网站建设 2026/10/14 18:15:28

STM32信号发生器设计:DDS与DAC波形生成原理及工程实现

简介:这是一套基于STM32单片机的信号发生器完整工程包,面向嵌入式开发者和电子设计爱好者,重点解决波形生成算法、数模转换与硬件电路设计相结合的综合实践问题。压缩包共146个文件,约1.46MB,内容涵盖C语言源码&#x…

作者头像 李华
网站建设 2026/10/14 18:15:28

Arthas ognl ClassNotFoundException 根因与ClassLoader解决方案

1. 问题本质与典型场景还原Arthas 是 Java 应用线上诊断的“手术刀”,而ognl命令是它最锋利的那把——能绕过源码、不重启、不侵入地读取任意对象状态、调用任意方法。但几乎每个刚上手 Arthas 的开发者,都在执行ognl时被ClassNotFoundException当头一棒…

作者头像 李华
网站建设 2026/10/14 18:15:09

Electron打包HTML为EXE:全屏无边框、隐藏任务栏、自定义图标

简介:本资源是一份面向前端开发者与桌面应用初学者的Electron实战项目包,聚焦于将HTML网页快速打包为功能完备的Windows原生.exe可执行程序。内容覆盖全屏启动、任务栏隐藏、Esc键退出、自定义图标与文件名等关键部署需求,解决Web开发者跨入桌…

作者头像 李华
网站建设 2026/10/14 18:14:22

Java泛型实例化创建对象的几种解法与实践

前段时间在给一个内部框架做通用查询模块,需要根据实体类型自动创建对象并填充数据。写完后回头看,发现整个过程中最绕不开的一个坎儿,就是标题里这个再基础不过的问题:Java 泛型实例化创建对象。你在代码里写下T t new T();&…

作者头像 李华