弱网下服务被杀时Retrofit KotlinExtensions非致命报错咨询
解答
- 这类非致命报错属于完全正常的预期内现象,和你观测到的上报时间与系统杀后台时间吻合的特征完全匹配。
- 先解释下这个堆栈的本质:你看到的
KotlinExtensions.kt line 53 retrofit2.KotlinExtensions$await$2$2.onResponse是Retrofit对Kotlin协程扩展函数await()的内置回调实现,所有走await()的请求发生错误时都会先落到这个回调节点,它本身不是根因,只是异常抛出的统一入口。 - 触发这类上报的核心原因分两类:
- 占比最高的就是你提到的系统静默杀后台场景:系统回收后台进程时,会直接中断进程内所有正在执行的网络连接、取消所有运行中的协程任务,OkHttp/Retrofit会把这类中断包装成异常抛到这个回调入口。
- 剩下的部分来自你提到的弱网环境:请求超时、连接闪断、网络切换等常规网络异常,同样会走到这个回调分支。
- 就算你把网络延迟、网络可靠性相关的异常逻辑全部处理完善,也无法完全消除这类上报,需要做两层处理过滤无效告警:
- 业务代码层兜底:所有Retrofit协程请求的catch逻辑,不要只覆盖网络相关的
IOException、SocketTimeoutException,必须额外catchCancellationException——协程作用域被取消(包括服务被销毁、系统杀进程前回收资源、主动取消请求)抛出的就是这类异常,属于正常流程终止,不需要做错误上报。 - 上报规则层过滤:在Crashlytics中配置自定义拦截规则,对异常链路做判断:如果异常根因是协程取消异常、或者后台状态下触发的连接中断异常,直接拦截不上报,避免这类无意义的非致命告警干扰正常问题排查。
- 业务代码层兜底:所有Retrofit协程请求的catch逻辑,不要只覆盖网络相关的
- 额外提一句适配建议:你做的每秒一次高频位置上报属于后台高耗电任务,就算做完所有厂商ROM省电适配、Doze模式适配,也不可能做到100%进程常驻,不用在后台存活上钻牛角尖,重点做好本地位置缓存、服务重启后的批量补报逻辑,保证数据不丢即可。
内容的提问来源于stack exchange,提问作者Toucouleur
相关产品推荐
相关产品推荐

