这个时候需要艾特大佬
比较难复现,也不太好解决
说到底,引擎做好了启动进入,但没做好退出销毁,官方默认是跟app进程绑定(不求同年同月生 … 的那种)
我目前思路是,发生Activity onDestroy,就把原生的 AppDeletegate 删除
AppDeletegate 继承与cocos2d::Application, 其析构函数有删除js引擎的操作 ,但引擎的删除不太彻底,如Scheduler、ThreadPool、AutoReleasePool 这些可能还需要自己处理,
AppDeletegate 的创建在 main.cpp
具体怎么写呢,不太了解这方面的知识。在Cocos2dxActivity.java的onDestroy()里写吗?
3.x有没有解决?2.4.6还有这个问题
2.x 引擎中的 Cocos2dxActivity 的 onDestroy 方法会直接把进程给杀死,的确没有处理资源的释放流程。
你是注释掉杀进程,然后发送消息给 native 去销毁 AppDelegate 么?
Log.d(TAG, "Cocos2dxActivity onDestroy: " + this + ", mGLSurfaceView" + mGLSurfaceView);
if (mGLSurfaceView != null) {
Cocos2dxHelper.terminateProcess();
}
ScriptEngine 是单件,它的构造和析构会对 v8 platform 做初始化和释放的操作,v8 platform 的初始化只能在一个进程初始化一次,所以释放 ScriptEngine 的时候不应该去调用 ScriptEngine::destroyInstance,而应该直接调用 ScriptEngine::getInstance()->cleanup()
你还,在java里要怎么调用 ScriptEngine 得方法。这个好像是c++得方法。我们得项目也遇到这个问题了。友盟收集了很多崩溃信息,大概1-3%得用户进去一会儿就崩溃了。
这个崩溃确实还是一直存在
这个问题在 2.x 引擎里面有PR吗
解决什么问题的 PR ?
感谢大佬回复,更详细的描述,我在github上创建了一个 issue,大佬有空帮忙看看~
看到了,由于时间有限,如果很容易出现,麻烦提交一个 demo 上传到 github,我们安排跟进一下。
都补充好到issue上了~
很好,描述很详细,点赞。
初步排查,这个问题只在 android 15 上出现,应该是 android 15 的 isTaskRoot 的行为发生了变化导致的。
可以这样修复:
Cocos2dxHelper.java
public static void endApplication() {
// --> 下面这两行注释掉
// if (sActivity != null)
// sActivity.finish();
// --> 添加如下这行:
terminateProcess();
}
在 2.4.16 中修复:
这可能是目前的一个最快的解决办法,但是可能会有一些隐患,因为这种直接杀进程的办法,是不会触发生命周期的回调,比如 onPause onStop onDestroy,不过目前来看,确实是能解决崩溃
旧代码退出流程: finish -> onDestroy -> terminateProcess
在 onDestroy 中要处理的事情,如果同步的还好,如果是异步的(比如网络请求),也不会被执行,因为 onDestroy 后面马上就杀进程了。
实操,这样修改后打包上线还是有奔溃问题