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

3.x未测试过,不一定有。我看了3.8的代码,这块的逻辑变了,它使用了GameActivity方式,可以在原生层面自己创建GL线程,自己管理GL线程。有可能能实现多Activity切换,规避该问题。

持续关注一下

哦 那得 好好研究一下了

线上验证过了.
修改代码 使用 start 状态的 isTaskRoot 的值, 在ondestroy 进行判断即可. android 15+ isTaskRoot 获取的值在 start 和 destroy 不一致导致的.

能贴一下代码 详细说说吗?

咋弄的。快给我说说。我也去试试 :grimacing: :grimacing:

遇到了一模一样的问题,有解决吗。 :thinking:

Cocos2dxActivity.java

public abstract class Cocos2dxActivity extends Activity implements Cocos2dxHelperListener {
    // ===========================================================
    // Constants
    // ===========================================================
    private int istaskroot = 0; //增加标记
...
protected void onCreate(final Bundle savedInstanceState) {
        
        super.onCreate(savedInstanceState);

        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (!isTaskRoot()) {
            // 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;
        }
        istaskroot = 1;  //记录 start 状态的 isTaskRoot 的值
...
    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Workaround in https://stackoverflow.com/questions/16283079/re-launch-of-activity-on-home-button-but-only-the-first-time/16447508
        if (istaskroot != 1) {  //使用 start 状态的 isTaskRoot 的值
            Log.d(TAG, "onDestroy: IsTaskRoot false");
            return;
        }
...

直接接入的RuStore么,这边接入的是qucik,quick套rustore,这边崩溃不进onCreate onDestroy。改了各种v8::Isolate崩溃,现在黑屏了无法恢复画面

用3.x吧。。

不好升,中重度项目,已经上了其他国际区域

这是AI给的一种解决方案 还没试过

崩溃原因
从 backtrace 可以清楚看到崩溃调用链: t
onSurfaceCreated → nativeInit → applicationDidFinishLaunching
→ ScriptEngine::start() → ScriptEngine::init() → ScriptEngine::cleanup()
→ v8::HandleScope::Initialize(v8::Isolate*) ← :boom: 崩溃点

核心问题:ScriptEngine::init() 在初始化时会先调用 cleanup() 清理旧状态,而 cleanup() 内部尝试创建
v8::HandleScope,但此时 V8 Isolate 尚未初始化(或已被销毁),导致空指针/非法内存访问崩溃。

为什么只在 Android 15 上出现:Android 15 改变了 Activity/Surface 的生命周期行为,onSurfaceCreated
可能在引擎未完全就绪或已销毁的状态下被重复调用。

修复方案

需要修改引擎层 C++ 代码,有以下几个关键修复点:

修复 1:ScriptEngine::cleanup() 增加 Isolate 空检查(最关键)

文件:cocos/scripting/js-bindings/jswrapper/v8/ScriptEngine.cpp

找到 cleanup() 方法,在创建 HandleScope 之前加入判断:

void ScriptEngine::cleanup()
{
if (!_isValid)
return;

  // ★ 关键修复:检查 _isolate 是否有效
  if (_isolate == nullptr)
      return;

  SE_LOGD("ScriptEngine::cleanup() begin ...\n");
  _isInCleanup = true;

  {
      // 只有 _isolate 有效才能创建 HandleScope
      v8::HandleScope handleScope(_isolate);
      // ... 原有清理逻辑
  }

  // ... 其余代码

}

修复 2:ScriptEngine::init() 增加重复初始化保护

同一文件中,init() 方法:

bool ScriptEngine::init()
{
// ★ 防止重复初始化
if (_isValid)
return true;

  cleanup();  // 清理旧状态

  // ... 原有初始化逻辑

}

修复 3:Java 层防止 nativeInit 被重复调用

文件:cocos2d-x/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxRenderer.java

private static boolean sNativeInitCompleted = false;

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
// ★ 防止在 Android 15 上被多次调用
if (!sNativeInitCompleted) {
Cocos2dxRenderer.nativeInit(this.mScreenWidth, this.mScreenHeight, mDefaultResourcePath);
sNativeInitCompleted = true;
}
// …
}

注意:如果应用支持从后台恢复,需要额外处理 sNativeInitCompleted 的重置逻辑。

修复 4(可选):nativeInit JNI 层加保护

文件:cocos2d-x/cocos/platform/android/jni/JniImp.cpp

static bool g_isEngineInitialized = false;

void Java_org_cocos2dx_lib_Cocos2dxRenderer_nativeInit(JNIEnv* env, jobject thiz,
jint w, jint h, jstring jDefaultResourcePath)
{
// ★ 防止引擎重复初始化
if (g_isEngineInitialized && cocos2d::Application::getInstance()) {
// 已经初始化过,只需处理 surface 重建
cocos2d::Application::getInstance()->applicationWillEnterForeground();
return;
}

  // ... 原有初始化逻辑

  g_isEngineInitialized = true;

}

推荐操作顺序

  1. 优先应用修复 1(cleanup 空检查),这是最直接解决崩溃的修改
  2. 然后应用修复 3(Java 层防重复调用),从源头防止问题
  3. 修复 2 和 4 作为额外安全保障

补充说明

  • Cocos Creator 2.4.x 官方已停止维护,不会有针对 Android 15 的官方修复
  • 如果你使用的是自定义引擎(Custom Engine),直接修改上述源码并重新编译即可
  • 如果使用的是内置引擎,需要先在项目根目录生成自定义引擎,再进行修改
  • 建议在修改后针对 Android 15 设备重点测试冷启动、热启动和后台切换场景

只搞view行不通,ccglsv在detachedFromWindow后也会触发crash,onDestory没进的crash估计也是这个问题,当ccactivity切到后台的时候,,或者不属于当前activity时,系统可能会触发某个view回收逻辑,出现detach,你可以手动remove再add试试,同一个activity也不行。
还得保证glthread是同一个,才能确保没有问题。

3.8没有这个问题。3.8的问题是gameactivity引起的anr,也头疼。

3.8 的anr可以参考这个验证下 https://github.com/cocos/cocos-engine-external/pull/507

嗯,是的。这个报错并没有进onDestroy。。现在ru的支付问题。一直都没解决,就在线上晾着 :rofl: :rofl:
3.x至少不会有这个毕现的崩溃

简单改引擎不太行,2.4.x的v8环境是在gl线程中实例化的,rustore切后台回前台,gl线程已经变了,相当于整个v8环境全部丢了。不过好消息是,rustore 发给我们一个测试版sdk,测试已经没问题了,等他们发布正式sdk后,在同步,应该不用很久

真的吗。~rustore那边 在跟进cocos2.x的版本吗!
能发我个测试sdk试试不~~

我们合作方比较给力,我加下你

可以尝试下,老哥。