关于Firebase中随机ANR(sun.misc.Unsafe.park)触发场景的技术咨询
ANR触发场景分析
上报的ANR栈日志
main (timed waiting):tid=1 systid=22386 at sun.misc.Unsafe.park(Native method) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:230) at kotlinx.coroutines.BlockingCoroutine.joinBlocking(Builders.kt:88) at kotlinx.coroutines.BuildersKt__BuildersKt.runBlocking(Builders.kt:59) at kotlinx.coroutines.BuildersKt.runBlocking(unavailable:1) at androidx.appcompat.app.AppCompatViewInflater.a(AppCompatViewInflater.java:20) at androidx.appcompat.widget.ActionBarBackgroundDrawable.c(ActionBarBackgroundDrawable.java:7) at androidx.core.app.ActivityRecreator$1.b(ActivityRecreator.java:4) at androidx.core.app.ActivityRecreator$1.<init>(ActivityRecreator.java:87) at com.example.sdk.MyService.initializeSdk(MyService.kt:13) at com.example.sdk.MyService.onStartCommand(MyService.kt:98) at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:4784) at android.app.ActivityThread.access$2000(ActivityThread.java:301) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2204) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:246) at android.app.ActivityThread.main(ActivityThread.java:8633) at java.lang.reflect.Method.invoke(Native method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
问题描述
我在Firebase中观测到部分设备随机上报上述ANR日志,恳请协助分析该ANR可能的触发场景,感谢您的帮助!
可能的触发场景分析
- 主线程阻塞核心原因:栈日志显示主线程通过
runBlocking启动协程后进入timed waiting状态。runBlocking会阻塞当前线程(此处为主线程)等待协程完成,若协程内任务长时间占用资源或等待未就绪条件,会导致主线程无法响应系统事件,触发ANR。 - SDK初始化的潜在风险:ANR触发点在
MyService.initializeSdk(MyService.kt:13),说明SDK初始化逻辑被放在主线程的runBlocking中。如果初始化包含以下操作,极易引发ANR:- 同步网络请求:未采用异步方式,直接在协程内发起网络调用且未设置合理超时,网络状况差的设备上会长期阻塞主线程。
- 磁盘IO操作:比如读写大文件、数据库同步查询,这类操作在IO性能差的设备上耗时可能超过系统ANR阈值(通常5秒)。
- 锁或资源等待:初始化过程中尝试获取被其他线程长期占用的锁,或依赖未完成的异步任务结果,导致
runBlocking持续等待。
- 系统组件交互影响:栈中出现
ActivityRecreator相关调用,说明初始化可能涉及Activity重建逻辑。部分设备系统对Activity状态恢复的处理存在差异,或应用后台运行时系统资源受限,导致ActivityRecreator操作无法及时完成,进而通过runBlocking阻塞主线程。 - 设备性能差异导致随机性:ANR仅在部分设备出现,大概率是不同设备的CPU、内存、IO性能差异导致。中低端设备或后台运行大量应用的设备资源不足,原本在高端设备上快速完成的初始化任务,在这些设备上耗时超过ANR阈值。
内容的提问来源于stack exchange,提问作者Maradiya Krupa
相关产品推荐
相关产品推荐

