我们在 macOS 打包机上使用 Jenkins 调用 Cocos Creator 3.8.8 自动构建支付宝小游戏时,遇到了资源导入异常、后续无法正常打包的问题。排查定位到 AssetDB 初始化存在时序竞争,整理出来供官方和遇到类似问题的开发者参考。
环境与现象
- macOS、Cocos Creator 3.8.8、Jenkins 自动构建。
- 同一台机器、同一个项目目录,曾出现 Dashboard 手动打开正常、Jenkins 启动异常的差异。
- 异常发生在 Builder 开始构建之前,资源初始化阶段就会把大量正常
.meta改写为以下异常特征:
{
"ver": "0.0.1",
"importer": "*"
}
完整项目曾出现 7,133 个异常 Meta,Creator 安装目录内还发现 499 个内置 Meta 被同样改写。在该打包机上,使用不包含业务扩展的空项目也能复现。
关键定位依据
异常时,AssetDB 的就绪状态与实际导入器状态不一致:
query-ready → true
query-all-importer → ["*"]
正常启动时,同一环境有 55 个导入器。因此,仅等待 query-ready=true,不能保证资源可以被正确导入。
进一步跟踪发现,初始化顺序存在以下窗口:
-
assetHandlerManager.init()获取当前已启用扩展的导入器快照。 - 内置
engine-extends随后启用,并发出enable事件。 -
AssetDBManager.init()完成后续异步配置读取后,才注册enable监听器。
如果扩展恰好在第 1、3 步之间启用,快照没有包含它,事件也没有被监听到,最终导致导入器漏注册。
一次失败记录中的时序为:
约 1873 ms 获取导入器快照
约 1874–1885 ms engine-extends 启用
约 1905 ms AssetDB 初始化完成,导入器仍未正确注册
随后 AssetDB 使用默认 * 导入器处理资源,将正常 Meta 改写为异常内容,进而影响后续构建。
手动打开与自动启动的差异可以由启动时序变化解释,但不能据此保证 Dashboard 启动一定正常。
尝试过的处理
恢复 Meta、清理缓存、重启 Editor,以及等待 AssetDB ready,都不能消除这个初始化窗口;再次启动仍可能把 Meta 改坏。
临时修复与验证
我们在 Creator 安装包层做了临时补丁:在原始 AssetDB init() 完成后、启动数据库并导入资源之前,重新检查已启用扩展,补注册遗漏的导入器。
补丁避免重复注册,不主动启用被禁用的扩展,也不依赖固定延时或 Meta 自动恢复。
2026 年 9 月 10 日的验证记录及后续 CLI 验证结果:
- 空项目两次冷启动、一次保留缓存启动,异常 Meta 均为 0。
- 完整项目连续两次 Jenkins 构建成功,导入器数量恢复为 55,无需恢复 Meta 或重启 Editor。
- 后续移除额外等待、恢复及重试逻辑,改回单次 CLI 构建,也通过了构建与产物检查。
以上验证覆盖构建和产物完整性,不包含渠道上传及真机验收。
希望官方确认
希望官方确认 Creator 3.8.8 AssetDB 获取导入器快照与注册扩展事件监听之间,是否存在漏注册窗口,以及后续版本是否已有对应修复。
也建议 AssetDB 在核心导入器未就绪时阻止资源导入,避免直接改写已有 Meta。