针对这种疑难问题,我们可以尝试通过以下方法解决。
- 查找可能的原因。通过上面的共性归类,我们先看看是某个系统版本的问题,还是某个厂商特定
ROM
的问题。虽然崩溃日志可能没有我们自己的代码,但通过操作路径和日志,我们可以找到一些怀疑的点。 - 尝试规避。查看可疑的代码调用,是否使用了不恰当的
API
,是否可以更换其他的实现方式规避。 Hook
解决。在了解了原因之后,最后可以通过Hook
的方式修改系统代码的逻辑来处理
比如我们发现线上出现一个 Toast
相关的系统崩溃,它只出现在 Android 7.0
的系统中,看起来是在 Toast
显示的时候窗口的 token
已经无效了。这有可能出现在 Toast
需要显示时,窗口已经销毁了。
android.view.WindowManager B a d T o k e n E x c e p t i o n : a t a n d r o i d . v i e w . V i e w R o o t I m p l . s e t V i e w ( V i e w R o o t I m p l . j a v a ) a t a n d r o i d . v i e w . W i n d o w M a n a g e r G l o b a l . a d d V i e w ( W i n d o w M a n a g e r G l o b a l . j a v a ) a t a n d r