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

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。

finish(); 这里面做了啥 ? 自己的程序逻辑吗? 目前这样效果如何?

Fatal Exception: java.lang.RuntimeException

Unable to start activity ComponentInfo{com.magicmjim.solitairewords.brainpuzzle/com.android.billingclient.api.ProxyBillingActivity}: java.lang.NullPointerException: Attempt to invoke virtual method ‘android.content.IntentSender android.app.PendingIntent.getIntentSender()’ on a null object reference

android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3645)

com.android.internal.os.ZygoteInit.main (ZygoteInit.java:936)

Caused by java.lang.NullPointerException

Attempt to invoke virtual method ‘android.content.IntentSender android.app.PendingIntent.getIntentSender()’ on a null object reference

com.android.billingclient.api.ProxyBillingActivity.onCreate (com.android.billingclient:billing@@8.2.0:158)

android.app.Activity.performCreate (Activity.java:8305)

android.app.Activity.performCreate (Activity.java:8284)

android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1417)

android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3626)

android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3782)

我目前在 谷歌的支付 也出现了 崩溃 怀疑也是 界面被销毁了 很头疼

finish是系统api,关闭当前Activity。
目前这个方法,在我这边测试下来没有再崩溃。

这个看上去和c++无关。java里空指针。

修改了还是不行
我这个 连cocos2dxactivity的onDestroy都没进 :rofl:


只有surface被摧毁了。。

贴一下完整代码,对比一下,红框中是需要修改的部分。我这个是2.4.15的代码。




这样的

你的项目可能存在更复杂的情况。看上面的日志,已经二次进入了cocos_android_app_init,这肯定崩溃的,因为GL线程切换了,v8那里不能换个线程访问。lunchMode需要singleTask。

这是个俄罗斯那边的一个支付界面。
没有进入activity的onDestroy,但是确实在重建surface :rofl:

那需要查找重建的原因了。在 Cocos2dxGLSurfaceView的构造函数中设置断点,查看调用堆栈,看看哪里触发的。正常应该在Cocos2dxActivity的onCreate中触发构造。

好我在查一下

en. 我贴的错误不够全面. 我自己先 再观察一下吧 按你的方法也试一下 这段代码 加了 总没错的.

一,原因分析
1,直接原因:
切换了线程访问了V8,V8线程检测失败崩溃。
2,崩溃堆栈和崩溃点:
这个崩溃堆栈并不固定,但是最终的崩溃点大部分都在 HandleScope 里面,因为我们访问v8时,一般都先调用AutoHandleScope。
3,为什么会切换了线程访问v8
因为在某些情况下,Cocos2dxActivity 会被销毁重新创建,此时会带动GLSurfaceView被重新创建,而GL线程是和GLSurfaceView绑定的,
因此重新创建后,GL线程变了。
4,Cocos2dxActivity为啥会被重新创建
Cocos2dxActivity的launchMode被设置为单任务(singleTask)这个能保证大部分情况下,Cocos2dxActivity不会被重新创建,但是不能保证100%不会
被销毁重新创建,在某些情况下,就会被重创建。

5,和cc.game.end引起的崩溃是啥关系?
这2个崩溃根本原因是一致的,即Cocos2dxActivity被销毁重建。但触发点不一样:
cc.game.end 是主动关闭finish了Activity。另外一个是Activity被系统关闭。

二,复现方法:
本人仅仅在一台XiaoMi 14 Pro Android 16上稳定复现:
1,通过AndroidStudio 和USB调试直接安装应用,被拉起后,切换后台再拉起,触发崩溃。
2,由于历史原因,我的项目中在Activity的onCreate中,请求了权限WRITE_EXTERNAL_STORAGE,此行为会导致在这台手机上,切换后台约2s,Cocos2dxActivity被销毁,
去掉后不再被销毁。

帖子分开不用审核。