【线上事故复盘】观看回放崩溃

一、事件描述

xxxAPP Vx.x.x.x版本,点击观看回放时,崩溃。

二、事件回复

17:44 老师反馈家长客户端崩溃,并附带崩溃视频;

17:44 ~ 18:22 登录家长账号,未能复现问题。查看百度统计后台,发现大量NullpointException错误,

java.lang.NullPointerException: Attempt to invoke virtual method ‘boolean java.lang.Boolean.booleanValue()’ on a null object reference
崩溃位置为xxxActivity的onStop方法,原因是把一个空的Boolean复制给了boolean。

18:22 ~ 20:54 排查问题

x月x日 提交QA测试,发布热更新。

三、问题处理

x月x日定位到问题,并修复。

x月x日提交给QA测试,发布热修复。

四、问题原因

核心技术点:

屏幕横竖屏切换时,任务栈中所有未设置 android:configChanges=“keyboardHidden|orientation|screenSize” 的Activity都会执行onPause、onDestroy、onCreate等生命周期,如果设置了前面的属性,则会执行onConfigurationChanged 方法。

问题原因:

  1. 从百度统计看,直接原因是将空的Boolean赋值给了boolean,而Boolean为空的原因是VideoPlayer为空。
  2. 因为回放页面是横屏页面,所以进入页面之后会有横竖屏切换,任务栈的Activity会走相应的生命周期,或者执行onConfigurationChanged方法。恰好任务栈中有xxxActivity(本应该被销毁)存在,并且没有设置configChanges属性,所以会走该Activity的onDestroy等生命周期。在它的onDestroy方法中,将播放器进行了释放,即iVideoPlayer = null。这样造成了xxxActivity中使用的VideoPlayer为空,引发了空指针。

解决方法:

由于xxxActivity没有及时销毁,导致生命周期重启影响了正常流程,所以从根本上要把xxxActivity及时关闭,把它从任务栈清除。解决操作是在Application添加了一行代码:Manager.INSTANCE.finishxxxActivity();

排查思路:

空指针——(什么地方空?)——>播放器为空——>(什么地方可以把播放器置为空?) ——> xxxManager的release方法 ——> (什么地方调用了这个方法?) ——> 1. xxxActivity的onDestroy方法(pass);2. xxView的onDestroy方法 ——> (什么地方用了xxView的onDestroy方法?) ——> xxxActivity的onDestroy方法 ——> (什么地方调用了onDestroy方法?) ——> 此处花费了较长的时间,其实有两种可能会调用该方法,一种是我们主动调用,另一种就是系统调用(因为onDestroy属于生命周期方法)。在分析的过程中,当没有找到主动调用的时候,就应该考虑系统调用,然后再分析什么情况下系统会影响Activity的生命周期,找到可能的原因,然后逐个排查。

五、暴露的问题
  1. 开发过程中代码不严谨,没有及时关闭Activity。(另一方面说明缺少代码审查和review)

  2. 测试过程中,用例覆盖不完整,没有测试没有开屏广告情况下,播放器是否受影响(因为开屏广告支持了视频,所以影响播放器相关)。

  3. 解决问题耗费时间太长,暴露了对业务代码不熟悉、解决问题思路不清晰、基础知识不熟悉的问题。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值