Cocos Creator 3.8.8 在 Jenkins 自动构建时,AssetDB 导入器漏注册,导致大量 .meta 被错误改写

我们在 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,不能保证资源可以被正确导入。

进一步跟踪发现,初始化顺序存在以下窗口:

  1. assetHandlerManager.init() 获取当前已启用扩展的导入器快照。
  2. 内置 engine-extends 随后启用,并发出 enable 事件。
  3. 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。

好像就3.8.8会有这个问题,我们之前使用3.8.4都没有这个问题,还有一个就是经常会报,找不到场景,这两个问题真的很烦