2.4.12一个必现的安卓崩溃!!!

  • Creator 版本: 2.4.12
  • 目标平台: Android
  • 重现方式:首次进入ru store的支付界面,切换到后台,然后再进入游戏里
  • 手机型号: 任何安
  • 重现概率:必现
    我问了下AI大概的问题可能是:

    下面是报错日志:
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A Cmdline: com.warrior.screw.rustore
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A pid: 2983, tid: 6344, name: GLThread 835 >>> com.warrior.screw.rustore <<<
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #00 pc 00000000010af364 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (v8::HandleScope::Initialize(v8::Isolate*)+144) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #01 pc 0000000000b713e8 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (se::ScriptEngine::cleanup()+88) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #02 pc 0000000000b71678 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (se::ScriptEngine::init()+36) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #03 pc 0000000000b72de0 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (se::ScriptEngine::start()+40) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #04 pc 0000000000ab128c /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (AppDelegate::applicationDidFinishLaunching()+184) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #05 pc 0000000000ac51f0 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/base.apk!libcocos2djs.so (Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit+224) (BuildId: f518e26e1219571a1e5c95e50dc3434489b06f40)
    2025-11-03 10:40:50.085 6367-6367 DEBUG pid-6367 A #08 pc 0000000000e0b926 /data/app/~~vmbxbFip7otS3dQX3f2RnQ==/com.warrior.screw.rustore-1QoHmzDzZSuStf5HwAaK1A==/oat/arm64/base.vdex (org.cocos2dx.lib.Cocos2dxRenderer.onSurfaceCreated+18)

麻烦官方人员看下呢~~我私发下apk啊啊啊啊啊啊啊啊啊啊啊啊啊

这个支付界面是俄罗斯的一个支付界面,使用了深度链接的方式相当于重新启动了一个Appactivity
点击购买,然后等弹出支付界面后。切换后台。再回到前台。必崩溃。
上面的方式必定会二次进入cocos2dxrenderer 的onsurfacecreated 。但是第二次进入,执行 清理的时候就报错了。
看了好多论坛帖子。都说2.4.x并不支持二次进入onsurfacecreated方法。
难道就没有临时的方法可以解决这个问题了嘛~ ~

建议修改activity的launchMode 然后测试看看

所有的模式都试过了,都不行。

能麻烦看下demo吗~
这个是singleTop模式下的日志
singleTop的崩溃日志.zip (9.6 KB)
这个是apk
https://chengyyxdl.leiting.com/220531/testru-release.apk
这个是清单文件的配置


我尝试了3.8.x是可以的。但是我们项目是2.4.12的,比较大,要升级3.x短时间不太现实~

楼主有解决这个问题么?我也遇到同样的问题,从后台切换到前台后,onSurfaceCreated被重复调用,导致引擎被初始化多次崩溃。
我在xiaomi 14Pro Android 16 HyperOs 3.0.4.0上后台切换回来必崩。
另外一台华为 Nova SE8 HarmonoyOs 2.0.0 上不会崩溃。

说一个不是办法的办法:
@Override
protected void onDestroy() {
super.onDestroy();

    // 强制杀死当前进程,确保内存完全释放
    // 这样下次启动就是全新的冷启动,避开 init/cleanup 的野指针问题
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(0);
}

写了很多 发不上来 不知道为什么 唉.,…

你这个解决的是另外一个问题,即调用cc.game.end()后,Activity关掉了,但进程可能没有退出的问题。这个是用户明确点击了退出,因此杀进程是没问题的。

我现在遇到的问题是,游戏切换到后台(注意不是退出),比如手动切换后台看一下桌面,然后再切换回来,在xiaomi 14Pro Android 16 HyperOs 3.0.4.0上面有很高概率二次触发onSurfaceCreated,导致二次进入main函数。
目前我在onSurfaceCreated里面做了拦截,阻止2次进入,但v8仍然崩溃。崩溃点变了(在AutoHandleScope处)。我目前还在研究。
引擎虽然调用了setPreserveEGLContextOnPause,目前看来,在某些系统机型上,仍然无法阻止Surface被销毁。目前尚未得知这种情况下,OpenGL Context 是否被销毁,包括各种显存资源是否被释放(设备丢失)。
引擎版本: 2.4.15。自升级V8到11.6。

那得等你 好消息了 我想不出什么好办法了

哈哈官方没有给解决办法,目前还没解决很头疼。不太好搞,之前尝试过在二次进入的时候直接return但是不行,onresume onstop等方法最终还是会进入cleanup中取,导致崩溃,说白了就是不支持。根本就没有考虑这种多activity切换的情况。3.x是重构了代码的。全部改了一遍的。
要么直接把项目升级到3.x
或者研究下3.x的代码,看看能不能吃透了再改改
不管哪种都很浪费时间哦。
我这都挂了这么多天的。官方也没啥动静哦 :rofl: :rofl: :rofl:

官方的动静都在那个AI上了,其他的没工夫搭理还,尤其是2 基本就是慢慢消亡掉了

哈哈是的 :rofl:
这个最好还是直接升3.x吧,或者从功能上规避。或者让sdk,别用 多activity了。 :grimacing:

找到了原因和解决方案,审核中。

istaskroot 的bug android 15 + 出现. 根据初始化的 istaskroot 在 destroy进行判断就可以了

就是这个意思。论坛里面回复长文需要审核。

审核好慢。

不是这个问题。
是这个帖子吗


之前试过了。不是这个问题。而且非android15也会有这个问题

这个修复方案不彻底,只解决了cc.game.end主动关闭的情况,未解决被系统被动关闭的情况。activity被系统被动关闭也会崩溃。

三,解决方法:
1,最简单的方法:
已知v8目前不能切换线程,那我们要保证不要在Activity重建后访问v8,因此需要做到:
进程中只能成功创建一个Cocos2dxActivity,我们记录下这个成功创建的Activity,在它被销毁时,我们要保证游戏进程被杀死,因为后面没办法再继续工作
1),在Cocos2dxActivity中添加静态变量,记录首次成功创建的Activity:

   static private   Cocos2dxActivity sMainActivity=null;
  1. , 在onCreate中,做如下修改:
   if (!isTaskRoot()||sMainActivity!=null) {
            // Android launched another instance of the root activity into an existing task
            //  so just quietly finish and go away, dropping the user back into the activity
            //  at the top of the stack (ie: the last state of this task)
            finish();
            Log.w(TAG, "[Workaround] Ignore the activity started from icon!");
            return;

        }
        sMainActivity=this;
 3),在onDestroy中做如下修改:
       //if (!isTaskRoot()) {
        if(sMainActivity!=this){
            Log.d(TAG, "Cocos2dxActivity onDestroy not main: " + this);
            return;
        }
        sMainActivity=null;

4) 观察一下onDestroy后的代码,有个terminateProcess,在sMainActivity被销毁时,后面进入该函数,进程被杀死。(仅说明,此处不用修改)

5)按此方法修改后,之前的那个cc.game.end 引起的崩溃修复方法已经不再需要,因为cc.game.end会finish游戏sMainActivity,自然进入onDestory后,进程被terminate。