事故背景
迭代需求有了短视频,要求有:
- 可以上下滑动;
- 支持多种视频格式;
- 视频播放不卡顿,有预加载,内存控制在一定水平;
在需求会之前,搜了下方案,发现了这个: flutter_tiktok大喜,遂直接clone到本地研读,运行了一下demo。感觉还不错哦,事情的进展是不是太顺利了。
不出意外的话,就出意外了,因为某些性能上的问题,不能继续下去。
研究了下当前可用的播放器,从原生角度来讲,只有video player和ijkplayer两种,要考虑格式支持、内存控制,这两种播放器都不能达到上线的标准,最后使用了付费的播放器。
闪退之内存溢出
用对了播放器,需求进展的很顺利,直到,iOS突然崩了,日志显示内存溢出了。
事故分析
每次闪退,都发生在刷视频的过程,从操作角度来看,一定是播放器的问题了。进到播放器,内存突然增加,持续刷视频,持续增加。
持续增长的内存,居高不下,直到闪退。
找闪退的证据
从表面现象查代码,眼睛都看花了,也没看出个所以然来,必须找证据了。
打开Flutter DevTools
观察内存的变化
看GC前后class的instances变化
发现Image数量特别高,一直在增加,于是将视频封面处理掉,在看内存状态,处于一个动态平衡状态。
修改代码后验证
图片问题处理后,内存处于动态平衡状态。