在BroadcastReceiver中使用goAsync()及后台协程调用Firebase.remoteConfig.fetchAndActivate()仍触发ANR的问题排查求助
在BroadcastReceiver中使用goAsync()及后台协程调用Firebase.remoteConfig.fetchAndActivate()仍触发ANR的问题排查求助
大家好,我最近遇到了一个特别头疼的问题——给App集成Firebase之后,后台的BroadcastReceiver里频繁出现ANR,但我本地无论怎么测试都复现不出来,而且100%的ANR都发生在后台场景。虽然前台用户感知不到,但我完全摸不着头脑,因为我几乎已经遵循了所有推荐的最佳实践:
- 用
goAsync()告知系统我需要做一些可能耗时的操作(但实际测试下来这些调用最多30ms,平均还不到10ms) - 调用的是最基础的
Firebase.remoteConfig.fetchAndActivate(),特意避开了addOnCompleteListener这类会跑在主线程的回调 - 为了双重保险,调用
goAsync()后我还在IO调度器上启动了协程,完全没有阻塞主线程的操作
我实在搞不懂,为什么这样还会触发ANR啊?
我的Receiver代码
class MyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { ... // 通知系统保持Receiver存活,准备处理任务 val pendingResult = goAsync() // 切换到后台线程执行任务 CoroutineScope(Dispatchers.IO).launch { try { // 拉取最新配置(系统默认12小时缓存,所以实际12小时仅触发一次真实请求) Firebase.remoteConfig.fetchAndActivate() } catch (e: Exception) { Timber.e("配置拉取失败: ${e.message}") } finally { // 通知系统任务完成,Receiver可以被销毁 pendingResult?.finish() } } ... } }
Play Console的ANR日志片段
"main" tid=1 Native #00 pc 0x00000000000a14e8 /apex/com.android.runtime/lib64/bionic/libc.so (__epoll_pwait+8) #01 pc 0x00000000000168d4 /system/lib64/libutils.so (android::Looper::pollInner(int)+180) #02 pc 0x00000000000167b8 /system/lib64/libutils.so (android::Looper::pollOnce(int, int*, int*, void**)+112) #03 pc 0x0000000000153f0c /system/lib64/libandroid_runtime.so (android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int)+44) at android.os.MessageQueue.nativePollOnce (Native method) at android.os.MessageQueue.next (MessageQueue.java:335) at android.os.Looper.loopOnce (Looper.java:186) at android.os.Looper.loop (Looper.java:313) at android.app.ActivityThread.main (ActivityThread.java:8751) at java.lang.reflect.Method.invoke (Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:571) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1135) "Signal Catcher" tid=6 Runnable #00 pc 0x0000000000567274 /apex/com.android.art/lib64/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, BacktraceMap*, char const*, art::ArtMethod*, void*, bool)+140) #01 pc 0x0000000000680184 /apex/com.android.art/lib64/libart.so (art::Thread::DumpStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool, BacktraceMap*, bool) const+356) #02 pc 0x000000000069e6ec /apex/com.android.art/lib64/libart.so (art::DumpCheckpoint::Run(art::Thread*)+916) #03 pc 0x0000000000698124 /apex/com.android.art/lib64/libart.so (art::ThreadList::RunCheckpoint(art::Closure*, art::Closure*)+524) #04 pc 0x00000000006972e4 /apex/com.android.art/lib64/libart.so (art::ThreadList::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, bool)+1460) #05 pc 0x0000000000696bec /apex/com.android.art/lib64/libart.so (art::ThreadList::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+1396) #06 pc 0x0000000000641708 /apex/com.android.art/lib64/libart.so (art::Runtime::DumpForSigQuit(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)+208) #07 pc 0x0000000000657240 /apex/com.android.art/lib64/libart.so (art::SignalCatcher::HandleSigQuit()+1400) #08 pc 0x0000000000656208 /apex/com.android.art/lib64/libart.so (art::SignalCatcher::Run(void*)+344) #09 pc 0x00000000000b4b38 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) #10 pc 0x0000000000052c60 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) "perfetto_hprof_listener" tid=7 Native #00 pc 0x00000000000a0284 /apex/com.android.runtime/lib64/bionic/libc.so (read+4) #01 pc 0x00000000000211e8 /apex/com.android.art/lib64/libperfetto_hprof.so (void* std::__1::__thread_proxy<std::__1::tuple<std::__1::unique_ptr<std::__1::__thread_struct, std::__1::default_delete<std::__1::__thread_struct> >, ArtPlugin_Initialize::$_33> >(void*)+280) #02 pc 0x00000000000b4b38 /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) #03 pc 0x0000000000052c60 /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) "Jit thread pool worker thread 0" tid=8 Native #00 pc 0x000000000004d81c /apex/com.android.runtime/lib64/bionic/libc.so (syscall+28) #01 pc 0x000000000028cccc /apex/com.android.art/lib64/libart.so (art::ConditionVariable::WaitHoldingLocks(art::Thread*)+148) #02 pc 0x00000000006a00e8 /apex/com.android.art/lib64/libart.so
有没有大佬能帮我分析下,这种情况到底是哪里出了问题?我实在是卡在这里找不到方向了...
内容来源于stack exchange




