运行时报这个错误,大神帮忙瞧瞧

导出Android项目后接入了友盟SDK,在错误报告那边发现以下问题,

java.lang.RuntimeException: Unable to destroy activity {cn.cl.nightwarrior.mi/org.cocos2dx.javascript.AppActivity}: java.lang.IllegalArgumentException: Receiver not registered: org.cocos2dx.lib.Cocos2dxHelper$BatteryReceiver@bca70f9
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4503)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4521)
at android.app.ActivityThread.-wrap5(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6696)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)
Caused by: java.lang.IllegalArgumentException: Receiver not registered: org.cocos2dx.lib.Cocos2dxHelper$BatteryReceiver@bca70f9
at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1182)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1443)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:649)
at org.cocos2dx.lib.Cocos2dxHelper.unregisterBatteryLevelReceiver(Cocos2dxHelper.java:125)
at org.cocos2dx.lib.Cocos2dxActivity.onDestroy(Cocos2dxActivity.java:377)
at org.cocos2dx.javascript.AppActivity.onDestroy(AppActivity.java:226)
at android.app.Activity.performDestroy(Activity.java:7242)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1249)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4490)
… 9 more
java.lang.IllegalArgumentException: Receiver not registered: org.cocos2dx.lib.Cocos2dxHelper$BatteryReceiver@bca70f9
at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:1182)
at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:1443)
at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:649)
at org.cocos2dx.lib.Cocos2dxHelper.unregisterBatteryLevelReceiver(Cocos2dxHelper.java:125)
at org.cocos2dx.lib.Cocos2dxActivity.onDestroy(Cocos2dxActivity.java:377)
at org.cocos2dx.javascript.AppActivity.onDestroy(AppActivity.java:226)
at android.app.Activity.performDestroy(Activity.java:7242)
at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1249)
at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4490)
at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4521)
at android.app.ActivityThread.-wrap5(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1681)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6696)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)

1赞

使用的creator 2.0.1版本

是引擎内部问题吗,请问如何解决呢

creaotr 1.10.0 在GooglePlay上就有这个崩溃,崩溃比例大概5%,占了我全部的崩溃情况

https://forum.cocos.com/t/android/68381
这个帖子也是这个问题

https://forum.cocos.com/t/2-0-1-android-bug/67078/4

这个帖子好像也是这个问题

问题应该是 “当注册广播时,常会遇到的问题就是重复注销广播处理函数是会报错,而且会让进程奔溃。” 这个原因吧
https://blog.csdn.net/xifeng1011/article/details/28093559

我修改了一下代码

4赞

这个应该不是引擎的问题。cocos 代码是在这里被调用的 at android.app.Instrumentation.callActivityOnDestroy, 应该是接的第三方的 sdk 的问题。

我这边目前也遇到了这个问题,发现在 Oppo R17 上,从应用商店打开后回到桌面,然后再从桌面点击 icon 进入,会报这个问题,引起 app 的 crash。 目前我们的奔溃日志,百分之八十和这个有关。

继续这个问题,找到了上面提到的稳定的复现方法:从应用市场打开游戏,回到桌面,再从桌面点击游戏icon 热启动游戏,

过两三秒闪退。 分析了奔溃日志,发现错误集中在某几个平台,且同一手机上,有的渠道的包有这个问题,有的没有,可以确定是打出来的包的问题。

我也不太懂安卓,网上随便看看,大致问题和这里描述的差不多
Android爬坑之旅之不易发现的BUG
深入讲解Android中Activity launchMode

然后找了别的组的大神问了下,猜测是 AndroidManifest.xml 中的 launchMode 的问题,对比不同渠道的 launchMode, 确实发现了,没有问题的渠道的 launchMode 都为 singleTask 或 singleTop,于是把所有渠道的 launchMode 改为 singleTask,打包装到手机上,发现确实好了。

1赞

改了 launchMode, 会引发其他一些问题,比如我们出现了广告不正常。

问题的根源其实是 cocos 的 bug,在从应用商店打开后,回到主界面,再从主界面进入, Cocos2dActivity.java 的 onCreate方法中, isTaskRoot 是false, 于是调用了 finish, 然后进入了 onDestroy,onDestroy 中去调用 unregisterBatteryLevelReceiver,然而当前这个新创建的 activity 实例并没有调用过 registerBatteryLevelReceiver, 导致异常,游戏闪退。

看了下 github 上最新的 CocosActivity, 该 bug 已经修复

1赞

请问怎么找最新的CocosActivity呢, 我也遇到了这个bug

手动顶一下.

手动顶一下

请问不修改引擎代码,怎么改可以避免这个bug
找到方法了,在app/src文件夹下增加与Cocos2dxHelper.java 包名相同的包org.cocos2dx.lib,在该包下增加Help.java类

package org.cocos2dx.lib;
import android.content.Context;

public class Helper {
    public static void registerBatteryLevelReceiver(Context context){
        Cocos2dxHelper.registerBatteryLevelReceiver(context);
    }
}

AppActivtity.java类中onCreate方法中,最上面增加如下代码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        if (!isTaskRoot()) {
            // 修复应用商店打开后,回到主界面,再从主界面进入, Cocos2dActivity.java 的 onCreate方法中, isTaskRoot 是false, 于是调用了 finish, 然后进入了 onDestroy,onDestroy 中去调用 unregisterBatteryLevelReceiver,然而当前这个新创建的 activity 实例并没有调用过 registerBatteryLevelReceiver, 导致异常,游戏闪退。
            Helper.registerBatteryLevelReceiver(this);
        }
    }