在新版本的测试阶段,测试同学发了一个必现的崩溃,log如下,
解决这种framework里抛出来的崩溃,需要先找到抛出错误的地方,再根据上下文条件,来分析出问题的来龙去脉,发现是这里
ensureExecReady函数是在FragmentTransaction里的一些列CommitXXX函数后触发的,而且mExecutingActions这个变量是也是导致出现这个问题的关键,但是源码里给这个变量赋值的地方有很多,这个时候在回头看看崩溃log,意思是FragmentManager is already executing transactions 这个崩溃导致了activity无法resume了,mExecutingActions有一处赋值就是在FragmentManager派发fragment生命周期的时候,而且在FragmentTransaction执行CommitXXX函数后mExecutingActions会重新赋值为false,线索太多我们梳理一下,
线索1:这个崩溃导致了activity无法resume(就是说activity在resume的时候触发了这个bug,所以resume无法完成).
线索2:mExecutingActions这个变量为true的时候再执行FragmentTransaction的CommitXXX函数会导致崩溃.
线索3:mExecutingActions在CommitXXX完成的时候会被重置.
线索4:mExecutingActions会在FragmentManager派发生命周期事件的时候会被赋值为true,派发完成也会被重置.
根据这个4线索,一个假设出现了,activity在执行resume的时候,会执行FragmentManager派发fragment的resume事件,如果在这个fragment的resume里又调用了activity的FragmentManager执行CommitXXX操作,那么就会命中这个崩溃出现的条件,之后查看项目代码,果然有这样的场景,问题找到了,解决问题办法就有了,就是在activity resume之后在执行CommitXXX,或者用childFragmentManager来执行CommitXXX.