西瓜视频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堆栈,以提高问题排查效率。
➡️