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

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被销毁,
去掉后不再被销毁。

帖子分开不用审核。

这样的话 一旦检测到 Activity 被重建 也只能说 先 退出游戏再说了.总比后台不停的报错好一些喽~

现在这个解决方案可能的问题是:
在某些用户意料之外的情况下,杀死进程会给人感觉屏幕闪了一下游戏消失,或者游戏启动没有成功,感觉是崩溃了(实际是游戏自kill了)。
完美的解决方案是,需要让nativie层支持Activity重建,支持设备丢失恢复等,这个修改成本巨大,不建议这么搞。

嗨,用2.4的都是真塔嘛的苦命人啊 ,这明明是应该官方出手来解决的事情,结果一堆人围着圈憋三天憋的脸通红,屁都没出来,官方人影都不见

我能想到的,较低成本能完美修复的方式是:
让Cocos2dxGLSurfaceView全局只有一个,并且不会销毁,能够在多个Activity之间流转,以达到让GL线程能一直跑下去,不会被销毁重建,直到进程结束。
这只是一个想法,没有去尝试,没时间。此方案能否行得通,未知。

是一个办法,我这的bug 不是必现的 所以没法试了. 等你有空 给试试 蹲个结果哈.

这个问题 3.x 估计也会有的,只能靠自己了.