Android webView 8.0系统 部分手机无法跳转页面 (Bugly引发的血案)

最近公司项目出现一个奇怪的问题,webView跳转页面的时候,在Android 8.0系统的oppo Vivo 还有三星手机无法跳转第三方存管页面,而跳转我们前端自己写的页面的时候是可以跳转的,顿时就有些郁闷了,难不成又被webView给坑了?萌生了想要把现有的原生webView给干掉,用开源的腾讯x5或者agentWeb给替换掉算了。不过还是想着先把问题给解决了再说。

查找解决问题方案

话不多少,直接去复查代码,打断点看到底是个啥子问题。打断点后发现跳转存管页面时,会进入shouldOverrideUrlLoading方法,当时的代码是这样子写的:

@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
     MyLog.d(TAG, "==> shouldOverrideUrlLoading url = " + url);
     view.loadUrl(url);
     return true;
 }

想着这个过滤重定向请求的重写方法也没毛病呀,有点不放心,还是网上搜索一些资料,发现别人也都是这样子写的呀,这个算是一个比较标准的写法了,而且我们也没有需求要拦截特定url链接。这个就有点纳闷了,是不是自己webView的某些配置没有到位呢?这里先贴出我当前webView的一些配置信息,如下:

private void initWebView() {
    mWebSettings = mProgressWebView.getSettings();
    mWebSettings.setJavaScriptEnabled(true);

    //设置自适应屏幕,两者合用
    mWebSettings.setUseWideViewPort(true); //将图片调整到适合webview的大小
    mWebSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小

    //缩放操作
    mWebSettings.setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
    mWebSettings.setBuiltInZoomControls(true); //设置内置的缩放控件。若为false,则该WebView不可缩放
    mWebSettings.setDisplayZoomControls(false); //隐藏原生的缩放控件


    mWebSettings.setDomStorageEnabled(true);
    mWebSettings.setAppCacheMaxSize(1024 * 1024 * 8);
    String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath();
    mWebSettings.setAppCachePath(appCachePath);
    mWebSettings.setAllowFileAccess(true);
    mWebSettings.setAppCacheEnabled(true);

    //是否可以后退
    mProgressWebView.canGoBack();
    //是否可以前进
    mProgressWebView.canGoForward();

    mWebSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

    // 关闭WebView的自动保存密码功能,防止用户密码被WebView明文存储 @author Steven created at 2018/1/22
    mWebSettings.setSavePassword(false);
}

感觉也没啥毛病呀,该配置的都已经配置好了呀,再去网站上查找了一些资料,添加有可能未配置会出现该问题。添加的配置如下:

// 设置WebView的属性使其支持内容重新布局
mWebSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
mWebSettings.setDefaultTextEncodingName("utf-8");
// 提高渲染的优先级
mWebSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
this.mProgressWebView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
// 开启第三方cookie的支持
if (android.os.Build.VERSION.SDK_INT >= 21) {
    CookieManager.getInstance().setAcceptThirdPartyCookies(mProgressWebView, true);
}else {
    CookieManager.getInstance().setAcceptCookie(true);
}

配置之后发现,依然没有啥用呀...照样的还是跳转不过去。


寻找备用方案

既然暂时找不出什么问题,而且时间紧迫,BUG得改呀,不能一直拖着,那就只能想别的替代方案了,没办法,只能换一下坑爹webView了。看了一下腾讯的X5以及agentWeb,开始想要集成X5来着,毕竟是大厂出品嘛,还是可靠一点,但是一看他们的集成文档,步骤都有十步,还要下载 SDK jar 包放到工程的libs目录下,将源码和XML里的系统包和类替换为SDK里的包和类。感觉有点麻烦,就想着还是用agentWeb吧,毕竟这也是个备选方案,看能不能先把当前BUG先解决了,再回头找出问题所在。

然后就是动手将原生的 webView替换成 agentWeb啦,还是比较简单的,替换的过程中也没有发现什么问题(当然原有的webView类还是没有删除的,就怕到时候找出问题了还得还原代码)。几乎是把原来 weiVIew里面的东西全部挪过去了,然后再尝试一下跳转存管页面,结果还是令人挺满意的,完全没有问题呀!!!可以进行跳转,当时的想法就是,坑爹的webView呀,爸爸要将你抛弃!!

agentWeb采用的就是默认配置

mAgentWeb = AgentWeb.with(this)
        .setAgentWebParent(mLlContainer, new LinearLayout.LayoutParams(-1, -1))
        .useDefaultIndicator()
        .setWebChromeClient(mWebChromeClient)
        .setWebViewClient(mWebViewClient)
        .setSecurityType(AgentWeb.SecurityType.STRICT_CHECK)
        .createAgentWeb()
        .ready()
        .go(mWebParams);

定位解决问题

当然如果只是到这里的话,就不关Bugly啥事了。虽然这个是可以用了,但是之前的问题还得找出来呀,毕竟这个只是一个紧急的备选处理方案,而且对 agentWeb没有太多的研究,到时候出问题了怎么破。而在这个时候,测试的小姐姐(公司开发部测试还是有几个小姐姐的)说之前4.6.4版本在这些不能跳转的机型上的是可以跳转存管页面的,但是现在的4.6.6不能跳转。

???当时我就一脸懵逼,这个webViewActivity(后文就用WebViewActivity来替代了)已经很久没有进行更改过了的感觉呀,怎么会之前的可以,而现在的不行呢?那没有办法,赶紧查看一下代码上传记录,因为隔了两个版本,代码上传的有点多,而且发现有两处地方进行更改过,可能导致这个部分机型不能跳转的兼容问题。

  1. 在4.6.4之后,对gradle进行了升级
  2. 公用的WebViewActivity进行更改过

因为之前同事就碰到过升级gradle然后出现了一些莫名其妙的问题,比如在与web交互的时候,写的方法明明是在主线程进行更新UI,打印出当前线程也是主线程,结果还是有问题,结果硬是在那个方法中用Handler发送了一条消息到主线程中进行更新UI才成功,完全没搞懂是个啥操作....这个就不细说了。当时我就觉得不会是gradle在作怪吧,那就有点难顶了呀。想想这个先不管了,先把WebViewActivity中更改过的代码还原一下,看能不能跳转吧。


嗯...还原回去还真能跳转,不是更新gradle导致的问题,先松了口气,然后一步一步的尝试,到底是改到哪个地方导致无法跳转呢?结果让我大跌眼镜,找到了万恶之源,部分代码如下(只贴出了导致问题的代码):

mProgressWebView.setWebChromeClient(new WebChromeClient() {

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        boolean isSuccess = CrashReport.setJavascriptMonitor(mProgressWebView, true);
        MyLog.e(TAG, "WebViewActivity.initWebView:Bugly Javascript的异常捕获功能是否成功:" + isSuccess);
        super.onProgressChanged(view, newProgress);
    }
}

而为什么会加上这行代码呢,因为之前领导说尽量捕获一些错误日志,然后上报定位问题,所以领导说了的咱也要听呀,所以就有了这个行代码的故事,捕获Javascript异常,提供给前端同事进行优化。而这行代码也不是瞎加的呀,是根据Bugly的官方文档加上去的呀。

Bugly官方文档截图.png

然后就是这两行代码导致了Android 8.0系统的oppo Vivo 还有三星手机无法跳转存管页面,删除之后就能跳转了,当然这个存管页面也确实是有JS错误,但是有JS错误你也得给我跳转过去呀...真的是有点难受。

Bugly错误日志截图.png

总结

经过此次事件让我学习到不要太过于相信大厂的框架,即便是强如腾讯大厂出品的拥有重多用户量的Bugly依然存在兼容性问题,当然这也从侧面表现出Android系统的混乱性以及兼容的复杂度,即便是大厂同样有兼容性的问题,所以Android开发各个系统的兼容性还有很大的探索空间以及提升。

当然如果你的项目中也有用到Bugly,并且使用了JS异常捕获功能,那你也得小心一点了,指不定哪天你的部分机型跳转web页面就不能跳转了,还是得谨慎使用呀!当然说不定腾讯大佬看到我的这篇文章就偷偷的把这个问题给优化了呢。哈哈哈,这样子当时是最好的啦。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容

  • 前言 由于业务需求更新迭代快,发布新版本的App需要时间,即使发布了也不能保证用户立即更新,因此越来越多的app使...
    JeremySun0823阅读 2,868评论 1 10
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,096评论 1 32
  • AndroidWebView 一、简介 WebView在Android平台上是一个特殊的View, 基于webki...
    斌林诚上阅读 1,879评论 0 5
  • 街上处处高挂起大红灯笼,应着春节的脚步,已然推脱了节前的各种活动。 曾经,总是碍于情面,迎来送往少不得的应酬,说着...
    简十一_阅读 451评论 0 0