org_cocos2dx_lib_Cocos2dxRenderer_nativeInit 崩溃分析

具体怎么写呢,不太了解这方面的知识。在Cocos2dxActivity.java的onDestroy()里写吗?

同样线上也有大量这种 crash。

这种最好还是由官方处理好些 @jare

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上了~

1赞

很好,描述很详细,点赞。

1赞

初步排查,这个问题只在 android 15 上出现,应该是 android 15 的 isTaskRoot 的行为发生了变化导致的。

可以这样修复:

Cocos2dxHelper.java

    public static void endApplication() {
 // --> 下面这两行注释掉
//        if (sActivity != null)
//            sActivity.finish();

// --> 添加如下这行:
        terminateProcess();
    }

在 2.4.16 中修复:

1赞

这可能是目前的一个最快的解决办法,但是可能会有一些隐患,因为这种直接杀进程的办法,是不会触发生命周期的回调,比如 onPause onStop onDestroy,不过目前来看,确实是能解决崩溃

旧代码退出流程: finish -> onDestroy -> terminateProcess

在 onDestroy 中要处理的事情,如果同步的还好,如果是异步的(比如网络请求),也不会被执行,因为 onDestroy 后面马上就杀进程了。

实操,这样修改后打包上线还是有奔溃问题

请问你们是否可以本地设备上复现?

请问合并修复 pr 后是否还会出现此问题?