西瓜视频RenderThread引起的闪退问题攻坚历程
💡
原文中文,约16100字,阅读约需39分钟。
📝
内容提要
本文讨论了西瓜视频客户端在Android 5~6上的闪退问题,分析发现问题是由于在主线程中调用TextureView的getBitmap方法导致的。文章介绍了问题的背景、影响和基本信息,并详细分析了RenderThread的工作原理和相关代码。最后,提出了修复方案并验证了修复效果,闪退问题得到显著改善,对业务和稳定性都有积极影响。
🎯
关键要点
- 西瓜视频客户端在Android 5~6上存在闪退问题,主要由于主线程中调用TextureView的getBitmap方法导致。
- 该问题在2022年占据Native Crash Top5,2023年上升至Top1,影响显著。
- 闪退问题集中在RenderThread线程,且无明显机型或厂商特征。
- RenderThread是一个单例模式的线程,通过TaskQueue执行RenderTask。
- CanvasContext::requireSurface方法在特定条件下会导致闪退,主要是mEglSurface为EGL_NO_SURFACE。
- 在Android 7.0及以上版本中,谷歌移除了requireSurface方法,从而避免了该问题。
- 通过字节码插桩全局替换TextureView.getBitmap方法,增加isLaidOut()判断来修复问题。
- 修复后,requireSurface相关的崩溃明显下降,直播场景有正向收益,业务和稳定性均得到提升。
- 后续需在RenderThread发生native crash时抓取主线程java堆栈,以提高问题排查效率。
➡️