cocoscreate3.8.4 到底能不能发apk,官方是不是在乱搞

public async showLoading(options?: LoadingOptions) {
this.loadingPrefab = await LoaderMgr.loadPrefab(RES_PATH.common.prefab.Loading);
if (!this.loadingPrefab) {
console.error(“Loading prefab is not loaded yet.”);
return;
}

const { title } = options || {};
// this.hideLoading();
// 实例化 Modal 预制体
this.loadingPrefabTem = instantiate(this.loadingPrefab);
// 获取 Canvas 节点作为父节点
const canvas:Node = director.getScene().getComponentInChildren(Canvas).node;
if(canvas) {
  if(this.loadingPrefabTem) {
    console.log(">>> --  ",(this.loadingPrefabTem instanceof Node),director.getScene().name)
    if(this.loadingPrefabTem.parent) {
      console.log("有父对象了")
      this.loadingPrefabTem.removeFromParent()
    } else {
      console.log("还没有父对象")
    }
    canvas.addChild(this.loadingPrefabTem);
  } else {
    console.log(" this.loadingPrefabTem 有问题")
  }    

} else {
  console.log("没有找到Canvas")
}    
console.log("Popup: 66666666666666")

}
以上这个方法中,高用的时候 ,从头到为都能打印,最后console.log(“Popup: 66666666666666”)这一行都没有问题,但是发apk以后,
canvas.addChild(this.loadingPrefabTem); 这一行一直报错,
canvas是正常的,
this.loadingPrefabTem也是正常中的,都是正常的,
在web下一点问题都没有,所有的实便都是正常正的。
我在Login场景中,点击登陆的时候 ,调用一下这个Loading, 其它什么都不做,就是调用 一下这个Loading显示一下,看看效果,现在就一直报错,

Login是一个场景 ,没有放在bundle中,
this.loadingPrefab = await LoaderMgr.loadPrefab(RES_PATH.common.prefab.Loading);
这个Loading是放在公共(common)的bundle中的,游戏刚运行的时候 ,就初始化加载了common这个bunlde, 在要显示Loading的时候 ,我从common这个bundle中去加载得到Loading这个prefab,

以上的所有东西,都是正常,也没有被释放,都是正常的对象,

最后就是在canvas.addChild(this.loadingPrefabTem); 一直报错,在androind的模拟器上,一直报错,web上没有任何问题,报错的错我就不贴出来了,都是混淆以后的报错,无法看,

以下是AI给的结果:

在 JSB 环境(V8 原生引擎)下, PrefabNode 的 native 对象存在严格的生命周期和归属检查,主要影响:

:one: 跨 bundle 的资源/节点引用严格检查

*** 例如: loadingPrefab 可能是从 common bundle 加载, Canvas 是主场景 bundle 加载,导致 native 内部不允许 canvas.addChild(prefabInstance) 。**
*** 在浏览器上没问题,但 JSB 原生严格。**

:two: 热更新/释放后缓存对象失效

*** 即使 isValid 为 true,但 prefab 的内部 native 资源可能“残缺”或处于无效 native 状态(这类状态在 JSB 下很隐蔽)。**

问题到底出在哪里,希望大家给能说一下吗,我到底哪里错了, 还是官方的问题?

模拟器运行看看是不是也报错,贴出报错消息

报错请帖出错误,然后如果有复现 demo 可以发给我们。

image

这么生气的标题吗

这就是错误,怎么看?

字看不清楚,麻烦给个文本吧

image 一般原生报错模拟器也会报错比较容易查看错误信息,android干扰信息太多不好查看

最后经过验证发现,实际上没有错,只是 showLoading() 这个方法,放在start()里调用 就没有错,如果通过点击按钮调用 就报错,这是为何?到底发布APK后,jsb做了什么?

start() {
Popup.showLoading(); 这里能正常显示,没有报错
}

换以下写法:
start() {
this.LoginContainer.getChildByPath(“Layout/Login”).on(NodeEventType.TOUCH_END, this.onLogin, this);
}

onLogin() {
Popup.showLoading();
这里就疯狂报错,这个方法里的 canvas.addChild(prefabInstance) 这里一直报错,
}

报错倒是把在模拟器上的报错信息贴出来啊

this.LoginContainer.getChildByPath(“Layout/Login”).on(NodeEventType.TOUCH_END, this.onLogin, this);

onLogin() {

Popup.showLoading();

}

然后疯狂报错

你都没有报错信息,谁能给你看
靠猜啊

路过尝试提供点思路。

  1. 看上面那个红框,应该已经输出了PopUp 666666。那说明其实是add成功到场景了。
    那下面的一直报错是什么原因呢,应该是在场景update的时候,加入的那个节点触发到什么错误了。

2.看那个Uncaughted Exception。 因为是update触发的,这个是比较麻烦的,你不好说在哪里catch去捕捉,看到里面的内容。建议把 window.onerror ,window.addEventListener(“error”,这些通用的错误捕捉注册上,看看里面的内容。
提供个列表:

window.addEventListener("error"
window.addEventListener("unhandledrejection"
window.__errorHandler
window.onerror
window.cc._throw

你只要能抓到这个error,就可以看它的堆栈了。

3.看下面那个红框,cpp这里开始报一个什么failed,(前面的字母看不清楚),那你可以先打个windows包,然后用vs在这个错误的地方下断点,一般android出错,windows可能也会出错。
然后断点的地方,你在watch里面输入:

se::ScriptEngine::getInstance()->getCurrentStackTrace()

那么就可以在vs里面看到js的堆栈信息。通常就算是release版的js堆栈,也可以看到一些函数名称。
你也可以在断点的地方,看看cpp这边有没有什么问题,具体是什么failed,是什么原因造成的。