TBS騰訊瀏覽服務WebView

起因

Android原生WebView存在痛點:

  1. 存在內存泄漏
  2. 4.4以前的版本是WebKit的內核,4.4以后才換成chromium的內核,碎片化的問題導致各個版本之間的運行效率參差不齊。

TBS X5WebView

  1. 官網 https://x5.tencent.com/tbs/
  2. 接入指南 https://x5.tencent.com/tbs/guide/sdkInit.html

優點

一. 官方描述

  • 速度快:相比系統webview的網頁打開速度有30+%的提升;

  • 省流量:使用云端優化技術使流量節省20+%;

  • 更安全:安全問題可以在24小時內修復;

  • 更穩定:經過億級用戶的使用考驗,CRASH率低于0.15%;

  • 兼容好:無系統內核的碎片化問題,更少的兼容性問題;

  • 體驗優:支持夜間模式、適屏排版、字體設置等瀏覽增強功能;

  • 功能全:在Html5、ES6上有更完整支持;

  • 更強大:集成強大的視頻播放器,支持視頻格式遠多于系統webview;

  • 視頻和文件格式的支持x5內核多于系統內核

  • 防劫持是x5內核的一大亮點

二. 測試發現,對H5頁面不能進行縮放的頁面會進行放大處理,更方便查看文字。

缺點

  1. 不支持cordova[crosswalk支持,但是會至少增加APK18M左右]

接入步驟

一. 下載 SDK jar 包放到工程的libs目錄下,將源碼和XML里的系統包和類替換為SDK里的包和類[參考官網對應關系]
二. 配置so文件

  • app\src\main\jniLibs\armeabi\liblbs.so
  • app\build.gradle配置
android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi", "armeabi-v7a", "x86", "mips"
        }
    }
}

三. AndroidManifest.xml里加入權限聲明

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />

四. 兼容處理

  • 在AndroidManifest.xml中設置
android:configChanges="orientation|screenSize|keyboardHidden"
android:windowSoftInputMode="stateHidden|adjustResize"
  • Activity在onCreate時需要設置
getWindow().setFormat(PixelFormat.TRANSLUCENT);(這個對宿主沒什么影響,建議聲明)
  • 在非硬繪手機和聲明需要controller的網頁上,視頻切換全屏和全屏切換回頁面內會出現視頻窗口透明問題
<item name="android:windowIsTranslucent">false></item>
  • 以下接口禁止(直接或反射)調用,避免視頻畫面無法顯示
webview.setLayerType()
webview.setDrawingCacheEnabled(true);

五. 混淆[http://res.imtt.qq.com/TES/proguard_20160822.zip]

六. 驗證X5內核是否加載成功
長按看是否出現復制,看菜單下方是否有兩個藍色的實心小水滴。

注意

  1. App中webView全部替換為X5的webView,否則不起效果
  2. sdk掃描工具.exe 掃描的結果text文本只顯示了"掃描完成!",不起作用
  3. 不設置setWebViewClient,默認會打開瀏覽器瀏覽網址,原生的沒有。為了更好的兼容性建議都設置上
    override fun shouldOverrideUrlLoading(webView: WebView, url: String): Boolean {
        if (!TextUtils.isEmpty(url)&&url.startsWith("http")){
            webView.loadUrl(url)
            return true
        }else{
            return super.shouldOverrideUrlLoading(webView, url)
        }
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容