最近项目中出现了一个比较诡异的bug.

项目中有个抽奖的功能,本着复杂页面靠前端的理念,两个抽奖页面由前端使用h5编写。 本来按照正常情况,应该是拿个webview加载一下,解决低端版本上的一些兼容问题就完事了。 但是在测试过程中发现了一个很诡异的问题。 转盘的指针,会有一定概率出现对不准奖品的问题。 经过一系列的排除,发现这个现象发生在非首次进入抽奖页面时才会出现,也就是说在app 完全杀死再次进入时是正常的。 再进入就会有比较高的概率出现上诉问题。

当时这个问题在前一天跟前端一起进行了一系列的排查,后来在我单独写的工程中运行正常。 然后针对这个问题进行了排查。 因为这个项目比较大,用到了像换肤,x5内核,视频播放等较多的三方库,只能一点一点进行排查。

主要从以下几点进行了排查。

  1. 换肤框架。 因为开发过程中因为这个踩了许多坑,首先把他排在了首位。
  2. webview配置问题。对webview的优化,适配,缓存等等做了一些配置,所以怀疑这个方面存在问题
  3. 页面渲染问题。页面存在可滚动的情况
  4. 兼容问题。之前在4.4以下出现过一些css样式的兼容问题,原因是4.4以下对h5的一些属性不是太友好
  5. webview内存泄漏问题。因为通常是在多次进入后出现该问题。
  6. fragment加载的问题。当时一个页面上面加载了两个fragment,加载了两种抽奖转盘

问题解决。

  1. 最先对换肤框架进行了禁用,结果发现没有作用,该坏的还是坏的
  2. 然后在写的demo中使用了完全一致的webview配置,以及同样的布局方式。依然没能复现 在demo中的一个页面加载了两个webview整个页面都有些乱了,但是转盘的位置,依然工作正常
  3. 使用谷歌浏览器的调试功能,对手机中webview中加载的页面进行了调试,发现打印的日志正常,js以及css样式都没有出现错误的情况。 不过这里出现了一个比较有趣的情况,当我连上调试时,手机页面会比较卡顿,但是转盘可以正常工作。断开以后依然正常,但是再次进入就不行了。
  4. 最后通过跟demo的对比,发现唯一没有去模拟的环节就是一个页面上没有去加载两个不同的fragment,并且webview加载的内容不同。 在项目中进行尝试缩减为一个Fragment,去切换webview中的内容时,工作正常。

    总结:

    一个页面中同时使用多个不同的fragment,使用webview加载不同的url时,会存在js及css动画执行异常的问题。 当时使用的布局,viewpageer 中存在两个不同的fragment,在这两个fragment中分别使用webview加载了不同的页面(页面中使用了比较接近的js及样式)

    这个问题最后的解决办法是,只使用一个fragment或者一个webview,切换tab标签时,动态更换加载的URL。

    问题分析:

    对于这个问题产生的原因,这里没有做过多的探究,也不太好定位到。初步分析,应该是webview底层解析html内容时存在并发安全问题。 两个webview同时加载时,可能会出现样式或者脚本干扰的情况。