升级3.8.8后,Android下使用evalString崩溃

在gp后台统计到的,本地复现不了,这可能是什么原因?
backtrace:

#00 pc 0x0000000000c8523c /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (se::ScriptEngine::isValid() const+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#01 pc 0x0000000000c3c5d8 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (Java_com_cocos_lib_CocosJavascriptJavaBridge_evalString+44) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#02 pc 0x0000000000d73068 /data/misc/apexdata/com.android.art/dalvik-cache/arm64/boot.oat (art_jni_trampoline+120)

#03 pc 0x0000000000bfddbc /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/oat/arm64/base.odex (adSDK.JSHelper$a.run+956)

#04 pc 0x0000000000d43c20 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/oat/arm64/base.odex (com.cocos.lib.CocosHelper$e.c+336)

#05 pc 0x0000000000d43c7c /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/oat/arm64/base.odex (com.cocos.lib.CocosHelper.flushTasksOnGameThread+44)

#06 pc 0x0000000000317460 /apex/com.android.art/lib64/libart.so (art_quick_invoke_static_stub+640)

#07 pc 0x0000000000316100 /apex/com.android.art/lib64/libart.so (art::JValue art::InvokeWithVarArgs<_jmethodID*>(art::ScopedObjectAccessAlreadyRunnable const&, _jobject*, _jmethodID*, std::__va_list)+800)

#08 pc 0x0000000000619330 /apex/com.android.art/lib64/libart.so (art::JNI::CallStaticVoidMethodV(_JNIEnv*, _jclass*, _jmethodID*, std::__va_list)+156)

#09 pc 0x000000000069cff0 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (_JNIEnv::CallStaticVoidMethod(_jclass*, _jmethodID*, …)+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#10 pc 0x000000000069ba30 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (void cc::JniHelper::callStaticVoidMethod<>(std::__ndk1::basic_string<char, std::__ndk1::char_traits, std::__ndk1::allocator> const&, std::__ndk1::basic_string<char, std::__ndk1::char_traits, std::__ndk1::allocator> const&)+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#11 pc 0x000000000069c5a4 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (cc::flushTasksOnGameThreadJNI()+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#12 pc 0x00000000006e1ef4 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (cc::AndroidPlatform::loop()+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#13 pc 0x00000000006e1d64 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (cc::AndroidPlatform::run(int, char const**)+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#14 pc 0x0000000000c687d8 /data/app/~~Di8eHczXB7eRfbvObutu_A==/game-VXI3Bl4g875lUJSVMkx0xA==/split_config.arm64_v8a.apk!libcocos.so (android_app_entry+1146880) (BuildId: 6eee021d51de7f156b5f2eb415aac74346a516f1)

#15 pc 0x00000000000d6e3c /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+204)

#16 pc 0x000000000006ab00 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64)

从这个堆栈看,感觉是 scriptengine 已经清理了,被 delete 了。但是你java层还给它发 evalString 的消息。

可以将 se::ScriptEngine::getInstance()->isValid() 再加一个条件判断,比如:

auto *se = se::ScriptEngine::getInstance();
if (se && se->isValid()) {
    se->evalString(...);
}
1赞