You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动