- 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.js 的 fsUtils>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.js 的 copyFile 中。
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.js:huawei-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接口疑问
其它 3.7.1 版本已知的打包问题: