在 cocos2dJs 跨平台游戏(在 Android 平台)中更改语言时设备崩溃

Crash on device during language change in cocos2dJs cross platform game (in Android Platform)

每当用户更改设备语言以及游戏在后台运行时,我们都会遇到崩溃。我们正在使用 cocos2dJs3.17.1 来构建我们的游戏。这似乎是框架问题,因为为了测试这个场景,我们创建了新的空白项目并尝试了同样的事情,它崩溃了。

产生崩溃的步骤:

  1. 打开游戏。
  2. 转到设备设置并更改语言。
  3. 打开后台游戏(在后台)
  4. 点击游戏中的一些按钮(你应该有一些按钮有一些触摸事件)

点击任何按钮游戏都会崩溃。

来自 adb 的堆栈跟踪 logcat:

01-31 12:10:57.814  6212  6451 W cr_ChildProcessConn: onServiceDisconnected (crash or killed by oom): pid=6454
01-31 12:10:57.998  6212  6212 E chromium: [ERROR:aw_browser_terminator.cc(125)] Renderer process (6454) crash detected (code -1).
01-31 12:10:58.026  6212  6212 E chromium: [ERROR:aw_browser_terminator.cc(90)] Render process (6454) kill (OOM or update) wasn't handed by all associated webviews, killing application.
01-31 12:10:58.183  3544  3544 I Zygote  : Process 6212 exited due to signal (9)
01-31 12:10:58.201  3926  4301 I ActivityManager: Process com.x.x (pid 6212) has died: cch+1CAC (117,340)"

任何想法或解决方案请在此线程中分享。

在这些情况下,最好手动重启应用程序。 您可以按如下方式稍微更改主要 activity:

private final String TRIGGER_REBIRTH = "trigger_rebirth";

@Override
protected void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null) {
     if (savedInstanceState.getBoolean(TRIGGER_REBIRTH, false)) {
        // Trigger app restart here
        // See Implementation - https://github.com/JakeWharton/ProcessPhoenix
        ProcessPhoenix.triggerRebirth(this, getIntent());
     }
  }
}

@Override
public void onSaveInstanceState(Bundle outState) {
  outState.putBoolean(TRIGGER_REBIRTH, true);
}

还可以防止 Cocos2d-x JS 引擎崩溃,JS_AbortIfWrongThread 发生在用户导航到在后台被 android 杀死的应用后。