崩溃日志信息:
E FATAL EXCEPTION: UnityMain
Process: cn.packageName, PID: 20736
java.lang.Error: *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
Version '2020.3.47f1 (5ef4f5b5e2d4)', Build type 'Release', Scripting Backend 'il2cpp', CPU 'arm64-v8a'
Build fingerprint: 'HUAWEI/NOH-AN00/HWNOH:12/HUAWEINOH-AN00/103.0.0.206C00:user/release-keys'
Revision: '0'
ABI: 'arm64'
Timestamp: 2023-07-26 17:13:49+0800
pid: 20736, tid: 20736, name: cn.packageName >>> cn.packageName <<<
uid: 10477
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4000200000000b
x0 0000007fdf585ed8 x1 0000007fdf585ef8 x2 0000000000000002 x3 b400007a7aa620c0
x4 b400007a7aa620b8 x5 0000000000000000 x6 0000000000000001 x7 0000000000000000
x8 0040002000000000 x9 0000007cbe723358 x10 0040002000000000 x11 0000000000000000
x12 00000000000000f7 x13 0040002000000000 x14 0000000000000001 x15 0000000000000011
x16 0000007de15ad0b0 x17 0000007de159c66c x18 0000000000000050 x19 b400007b711d7200
x20 0000007fdf586088 x21 0000007fdf586660 x22 b400007a203cdf00 x23 b400007a203d7788
x24 b400007a7aa620b8 x25 0000000000000000 x26 0000000000000000 x27 00000000003fffe1
x28 0040002000000000 x29 0000007fdf585eb0
sp 0000007fdf585eb0 lr 0000007b73141f70 pc 0000007b72e23bac
backtrace:
#00 pc 000000000039bbac /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::String::GetFlatContent(v8::internal::PerThreadAssertScopeDebugOnly<(v8::internal::PerThreadAssertType)0, false> const&)+16) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#01 pc 00000000006b9f6c /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)+40) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#02 pc 00000000003b536c /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::Parser::ParseFunction(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>)+840) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#03 pc 00000000003d858c /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::parsing::ParseFunction(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportErrorsAndStatisticsMode)+408) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#04 pc 00000000001c81b4 /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::(anonymous namespace)::RenderCallSite(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::MessageLocation*, v8::internal::CallPrinter::ErrorHint*)+144) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#05 pc 00000000001c8b2c /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::ErrorUtils::NewCalledNonCallableError(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>)+56) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#06 pc 0000000000785e08 /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*)+68) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
#07 pc 00000000005f2d28 /data/app/~~lNAE8JmffhsBuqd9XfAR6g==/cn.packageName-BjvxV5PlQdkFKYwCJlPtjg==/lib/arm64/libpuerts.so (Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit+104) (BuildId: 75422d62e179e88082618bf734e9b5664fd19c33)
2023-07-26 17:13:50.388 20736-20893 AndroidRuntime cn.packageName E at libpuerts.v8::internal::String::GetFlatContent(v8::internal::PerThreadAssertScopeDebugOnly<(v8::internal::PerThreadAssertType)0, false> const&)(GetFlatContent:16)
at libpuerts.v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)(GetString:40)
at libpuerts.v8::internal::Parser::ParseFunction(v8::internal::Isolate*, v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>)(ParseFunction:840)
at libpuerts.v8::internal::parsing::ParseFunction(v8::internal::ParseInfo*, v8::internal::Handle<v8::internal::SharedFunctionInfo>, v8::internal::Isolate*, v8::internal::parsing::ReportErrorsAndStatisticsMode)(ParseFunction:408)
at libpuerts.v8::internal::(anonymous namespace)::RenderCallSite(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>, v8::internal::MessageLocation*, v8::internal::CallPrinter::ErrorHint*)(:144)
at libpuerts.v8::internal::ErrorUtils::NewCalledNonCallableError(v8::internal::Isolate*, v8::internal::Handle<v8::internal::Object>)(NewCalledNonCallableError:56)
at libpuerts.v8::internal::Runtime_ThrowCalledNonCallable(int, unsigned long*, v8::internal::Isolate*)(Runtime_ThrowCalledNonCallable:68)
at libpuerts.Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit(Builtins_CEntry_Return1_DontSaveFPRegs_ArgvOnStack_NoBuiltinExit:104)
E FATAL EXCEPTION: UnityMain signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault at libpuerts.v8::internal::AstValueFactory::GetString(v8::internal::Handle<v8::internal::String>)(GetString:40)
根据报错信息,可以看出是回调函数出现找不到数据的情况了。
交互的代码也比较简单,就是一个传值的回调。
NativeProxyAdvertisement.listener = object : NativeProxyAdvertisementListener {
override fun onShow(
placementId: String,
callback: NativeProxyAdvertisementCallbackListener?
) {
log{"ttttttt:enter:${Thread.currentThread().name}:"+callback.hashCode()}
disposable?.dispose()
disposable = showAds(activity, placementId).subscribe({
log{"ttttttt:handler:${Thread.currentThread().name}:"+callback.hashCode()}
callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
log{"ttttttt:已经完成回调"}
}, {
log{"ttttttt:handler:${Thread.currentThread().name}:"+callback.hashCode()}
callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
log{"ttttttt:已经完成回调"}
})
}
}
在多次与unity交互的时候,会出现偶现崩溃的问题。
D message: ttttttt:enter:UnityMain:79875456,
D message: ttttttt:handler:main:79875456,
D message: ttttttt:已经完成回调,
经过排查发现Unity的调起方法,是处于UnityMain线程中。而我们通过RXJava或者协程请求的网络数据,返回的时候,都是返回到了main主线程中。
而这里就存在线程间通信的问题。所以我们这里需要将其统一到一个线程中。避免出现跨线程通信的问题。
代码样例如下:
NativeProxyAdvertisement.listener = object : NativeProxyAdvertisementListener {
override fun onShow(
placementId: String,
callback: NativeProxyAdvertisementCallbackListener?
) {
log { "ttttttt:enter:${Thread.currentThread().name}:" + callback.hashCode() }
disposable?.dispose()
val handler = android.os.Handler()
disposable = showAds(activity, placementId).subscribe({
handler.post(Runnable {
log { "ttttttt:handler:${Thread.currentThread().name}:" + callback.hashCode() }
callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
log { "ttttttt:已经完成回调" }
})
}, {
handler.post(Runnable {
log { "ttttttt:handler:${Thread.currentThread().name}:" + callback.hashCode() }
callback?.onShowCallback(AdvertisementShowResult.SKIPPED)
log { "ttttttt:已经完成回调" }
})
})
}
}
运行结果如下:
D message: ttttttt:enter:UnityMain:191152737,
D message: ttttttt:handler:UnityMain:191152737,
D message: ttttttt:已经完成回调,
可以看出这样修改之后,调用和回调,均处在UnityMain线程中,崩溃问题解决。