华为快游戏由于引擎代码错误,导致资源加载出现问题,卡Loading页

  • Creator 版本: 3.7.1
  • 目标平台: 华为小游戏 真机
  • 重现方式:见下方详细描述
  • 首个报错:见下方详细描述
  • 编辑器操作系统: Windows
  • 重现概率: 100%

打华为包,首次启动正常。第二次启动的时候会卡在加载页。

关键信息为这个 Read file failed 警告。

2023-08-02 14:20:24.763 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  W  [WARN]: Read file failed: path: proto-file://usr/gamecaches/resources/16909571126361.json message: [object Object]
2023-08-02 14:20:24.896 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  W  [WARN]: Read file failed: path: proto-file://usr/gamecaches/main/16909571120990.json message: [object Object]
2023-08-02 14:20:28.219 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  W  [WARN]: Read file failed: path: proto-file://usr/gamecaches/resources/16909571134512.json message: [object Object]
2023-08-02 14:20:30.365 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  W  [WARN]: Read file failed: path: proto-file://usr/gamecaches/resources/16909571139783.pkm message: [object Object]

除此之外还有报错 no such file or directory

2023-08-02 14:20:30.367 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  E  [ERROR]: no such file or directory Error: no such file or directory
2023-08-02 14:20:30.367 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  E  [ERROR]: no such file or directory Error: no such file or directory
2023-08-02 14:20:30.368 27737-29530 jsLog com...wei.fastapp.dev.app.launcher0  E  [ERROR]: [object Object]

其中 Read file failed 警告出现在对应引擎代码 platforms>runtime>common>engine>fs-utils.jsfsUtils>readFile>fail

    readFile(filePath, encoding, onComplete) {
        fs.readFile({
            filePath: filePath,
            encoding: encoding,
            success: function (res) {
                onComplete && onComplete(null, res.data);
            },
            fail: function (res) {
                console.warn(`Read file failed: path: ${filePath} message: ${res.errMsg}`);
                onComplete && onComplete(new Error(res.errMsg), null);
            }
        });
    },

调用栈如下

>> readFile()                       ... platforms>runtime>common>engine>fs-utils.js
>> readArrayBuffer()                ... platforms>runtime>common>engine>fs-utils.js
>> parsePVRTex()                    ... platforms>runtime>common>engine>asset-manager.js
>> parse()                          ... cocos>asset>asset-manager>parser.ts
>> Pipeline('loadOneAsset').parse() ... cocos>asset>asset-manager>load.ts
>> load()                           ... cocos>asset>asset-manager>load.ts

文件在读取时出现问题,那我们得找到文件是怎么保存的。经过排查,发现问题出现在

platforms>runtime>common>engine>cache-manager.js_cache 中。

    if (!isCopy) {
        downloadFile(srcUrl, localPath, null, callback);
    }
    else {
        copyFile(srcUrl, localPath, callback); // <-------------- 这里没有成功
    }

platforms>runtime>common>engine>fs-utils.jscopyFile 中。

    fs.copyFile({
        srcPath: srcPath,
        destPath: destPath,
        success: function () {
            onComplete && onComplete(null);
        },
        fail: function (res) {
            console.warn(`Copy file failed: path: ${srcPath} message: ${res.errMsg}`);
            onComplete && onComplete(new Error(res.errMsg));
        }
    }); // <-------- 虽然执行了 success 回调,但是实际上并没有复制成功

至于为什么没有复制成功,可见华为文档
至于为什么没有复制成功,可见华为文档
至于为什么没有复制成功,可见华为文档

调用FileSystemManager.copyFile将文件写入缓存,出现“no such file or directory”,如何处理?
如果调用接口使用的源文件是临时文件,则该接口目前不支持此场景。

我暂时的处理方案是,手动修改 platforms>runtime>common>engine>fs-utils.js,然后执行 npm run bundle-adapter 重新打出 平台适配js。

    copyFile(srcPath, destPath, onComplete) {
        // proto-ccfile://tmp/tmpfile1690957117197706281419.tmp
        function isTmpFile(url) {
            return url.startsWith("proto-ccfile://tmp/");
        }
        if (isTmpFile(srcPath)) {
            this.saveFile(srcPath, destPath, onComplete);
        } else {
            fs.copyFile({
                srcPath: srcPath,
                destPath: destPath,
                success: function () {
                    onComplete && onComplete(null);
                },
                fail: function (res) {
                    console.warn(`Copy file failed: path: ${srcPath} message: ${res.errMsg}`);
                    onComplete && onComplete(new Error(res.errMsg));
                }
            });
        }
    },

附上打包后的 engine-adapter.jshuawei-quick-game修改后的engine-adapter.zip (13.6 KB)
可以直接复制到引擎文件夹对应路径使用,路径格式参考这个路径
C:\CocosDashboard_1.2.3\resources\.editors\Creator\3.7.1\resources\resources\3d\engine\bin\adapter\runtime\huawei-quick-game

关联帖子

CocosCreator华为小游戏第二次启动卡住问题与FileSystemManager.copyFile接口疑问

【creator】华为快游戏小包模式加载资源会出问题

其它 3.7.1 版本已知的打包问题:

小米卡加载

安卓转屏崩溃

2赞

@jare

@jare

@jare

等待回复…

等待回复….

等待回复……

等待回复………

等待回复……….

等待回复…………

等待回复………….

@jare 人呢