Android WebView 内核适配——WebKit 转 chromium

    年刚过,一回来bug来袭,年前提前回家过年了,来了之后同事告诉我Android 4.4以下的手机H5加载不出来,暂时来不及解决直接就上线了,顿时满脸黑线,这都可以,我不在的时候都发生了啥?
    于是乎,调试模式打开,拿了一个华为的4.0的手机测试,乖乖,果然空空的页面,毛线都没有一根,Log显示如下:
Viewport argument key "minimal-ui" not recognized and ignored
    度娘和谷歌儿子查一遍再说
    大致的结果是谷歌这孙子杀千刀的在4.0之前一直用的是webkit内核做的移动端引擎支持,而4.0之后就换成了chromium做内核了,其原因必然是因为H5越来越普及才这么搞得,然而,问题不在这里,问题是这孙子没有做向下版本兼容解决方案,什么世道啊,4.0的手机还是很多的好吧!老板让解决问题只要结果好吧!
    传统系统内核(Webview)存在适配成本高、不安全、不稳定、耗流量、速度慢、视频播放差、文件能力差等问题,这是移动应用开发商在进行Hybrid App开发时普遍面临的难题。于是乎这会儿咱们的马化腾同学闪亮登场,话说BAT还真是做了点儿实事儿哈!腾讯浏览服务基于腾讯X5内核解决方案,能够有效解决传统移动web技术面临的普遍问题,同时能极大扩展应用(Hybrid App)内浏览场景的服务能力。
     废话不多说,上解决方案:
     [官网地址](http://x5.tencent.com)
     [jar包下载地址](http://res.imtt.qq.com/TES/tbs_sdk_thirdapp_v3.0.0.1038_43000_1485049870479.zip)
     下载 SDK jar 包放到工程的libs目录下,将源码和XML里的系统包和类替换为SDK里的包和类
     注意,这里替换的只是所引用的WebKit源生类的包路径,类名都不动,这也方便了批量替换。
     需要注意的是:
     1)请不要在代码里使用下述写法:
            import android.*;
            import android.webkit.*;
            import android.webkit.WebStorage.*;
            import android.net.*;
            import android.net.http.*;
      2)除了源码里需要把相关的包名和类名进行替换,布局xml里的声明也需要替换,例如:
            <com.tencent.smtt.sdk.WebView
            android:id="@+id/forum_context"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:paddingLeft="5dp"
            android:paddingRight="5dp" />
      适配修改:

              1. App 首次就可以加载 x5 内核

                App 在启动后(例如在 Application 的 onCreate 中)立刻调用 QbSdk 的预加载接口 initX5Environment ,  可参考接入示例,第一个参数传入 context,第二个参数传入 callback,不需要 callback 的可以传入 null,initX5Environment 内部会创建一个线程向后台查询当前可用内核版本号,这个函数内是异步执行所以不会阻塞 App 主线程,这个函数内是轻量级执行所以对 App 启动性能没有影响,当 App 后续创建 webview 时就可以首次加载 x5 内核了

              2. 目前,由于SDK WebView所提供的WebView类,是对系统WebView的聚合包装,所以:获取系统内核的WebView或者 x5内核的WebView的宽高
            android.webkit.WebView webView = new android.webkit.WebView(this);
            int width = webView.getWidth();
      需要采用下面的方式进行
            com.tencent.smtt.sdk.WebView webView = new com.tencent.smtt.sdk.WebView(this);
            int width = webView.getView().getWidth();
       至此我的问题测试过后是解决了,在倒包的过程中有一个是280KB的 有一个是100多kb的,建议用大的,免得别人拿着一个微信或者QQ告诉你为啥别人能实现这种效果你得不能,你们懂得......
       下一个介绍我在开发的时候遇到的WebView另外一个坑爹的坑,爬了好久才爬出来。

猜你喜欢

转载自blog.csdn.net/pimian13611397598/article/details/54972958