3.x未测试过,不一定有。我看了3.8的代码,这块的逻辑变了,它使用了GameActivity方式,可以在原生层面自己创建GL线程,自己管理GL线程。有可能能实现多Activity切换,规避该问题。
持续关注一下
哦 那得 好好研究一下了
线上验证过了.
修改代码 使用 start 状态的 isTaskRoot 的值, 在ondestroy 进行判断即可. android 15+ isTaskRoot 获取的值在 start 和 destroy 不一致导致的.
能贴一下代码 详细说说吗?
咋弄的。快给我说说。我也去试试

遇到了一模一样的问题,有解决吗。 
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*) ←
崩溃点
核心问题: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(cleanup 空检查),这是最直接解决崩溃的修改
- 然后应用修复 3(Java 层防重复调用),从源头防止问题
- 修复 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,也头疼。
嗯,是的。这个报错并没有进onDestroy。。现在ru的支付问题。一直都没解决,就在线上晾着

3.x至少不会有这个毕现的崩溃
简单改引擎不太行,2.4.x的v8环境是在gl线程中实例化的,rustore切后台回前台,gl线程已经变了,相当于整个v8环境全部丢了。不过好消息是,rustore 发给我们一个测试版sdk,测试已经没问题了,等他们发布正式sdk后,在同步,应该不用很久
真的吗。~rustore那边 在跟进cocos2.x的版本吗!
能发我个测试sdk试试不~~
我们合作方比较给力,我加下你
可以尝试下,老哥。