騰訊x5webview集成實戰

應用中許多網頁因爲優化的不夠理想,出現加載慢,加載時間長等,並且由於碎片化致使兼容性問題,有一些網頁有視頻內容,產品還提出各類小窗需求,搞得心力憔悴。找到公開的有crosswalk和x5webview,通過分析和研究決定上x5weview,他的好處有哪些呢?html

1. TBS(騰訊瀏覽服務)的優點android

1) 速度快:相比系統webview的網頁打開速度有30+%的提高;web

2) 省流量:使用雲端優化技術使流量節省20+%;安全

3) 更安全:安全問題能夠在24小時內修復;網絡

4) 更穩定:通過億級用戶的使用考驗,CRASH率低於0.15%;app

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

6) 體驗優:支持夜間模式、適屏排版、字體設置等瀏覽加強功能;佈局

7) 功能全:在Html五、ES6上有更完整支持;測試

8) 更強大:集成強大的視頻播放器,支持視頻格式遠多於系統webview;字體

9) 視頻和文件格式的支持x5內核多於系統內核

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

2. 運行環境

1)手機ROM版本高於或等於2.2版本

2)手機RAM大於500M,該RAM值經過手機 /proc/meminfo 文件的MemTotal動態獲取

注:若是不知足上述條件,SDK會自動切換到系統WebView,SDK使用者不用關心該切換過程。

3. SDK尺寸指標

1)SDK提供的JAR包約250K

通過實際測試對一些頁面的支持確實比原生的好,尤爲是對視頻的支持上面,解碼和加載效果明顯。並且對一些很是重的頁面支持比較好,常常發現有一些在PC端的頁面直接就甩過來丟到app上面,一看幾十M,加載半天加載不出來,並且白屏,特別煩。關鍵webview仍是有點問題的,有時候加載錯誤也不回調,進度直接卡死。

 

集成步驟:

1.導入jar包.

2.導入so庫。這裏須要注意的是,只提供了ameabli的,若是要求其餘的直接考一個到讀應的目錄就行。

3.權限聲明增長下面配置:

<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" />

4.替換到app中原先全部的webview,包括佈局和動態建立的webview--x5webview。

5.初始化,上報錯誤能夠不加。

QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

            @Override
            public void onViewInitFinished(boolean finished) {
                //x5內核初始化完成的回調,爲true表示x5內核加載成功,不然表示x5內核加載失敗,會自動切換到系統內核。
                LogUtil.e("my", " onViewInitFinished is " + finished);
            }

            @Override
            public void onCoreInitFinished() {
                LogUtil.e("my", " onCoreInitFinished  " );
            }
        };
        //x5內核初始化接口

        try {
            QbSdk.initX5Environment(getApplicationContext(), cb);
        } catch (Exception e) {
        }

        CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(getApplicationContext());
        strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
            public Map<String, String> onCrashHandleStart(int crashType, String errorType, String errorMessage, String errorStack) {
                LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();

                String x5CrashInfo = com.tencent.smtt.sdk.WebView.getCrashExtraMessage(getApplicationContext());
                map.put("x5crashInfo", x5CrashInfo);
                return map;
            }

            @Override


            public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType, String errorMessage, String errorStack) {
                try {
                    return "Extra data.".getBytes("UTF-8");
                } catch (Exception e) {
                    return null;
                }
            }
        });

7.注意事項

 若是須要使用播放器功能,須要播放的頁面在清單文件中加入,不加的話,呵呵呵,好比小窗模式 在某些手機上就用不了

頁面的Activity須要聲明android:configChanges="orientation|screenSize|keyboardHidden"

 

爲了不閃爍的問題,在activity中要加入:

getWindow().setFormat(PixelFormat.TRANSLUCENT);(這個對宿主沒什麼影響,建議聲明)

 

不要去嘗試調用

webview.setLayerType()
webview.setDrawingCacheEnabled(true);

重要的點,關於websettings的設置,必定按照demo中的來,個人配置以下

WebSettings webSetting = this.getSettings();
        webSetting.setJavaScriptEnabled(true);
        webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
        webSetting.setAllowFileAccess(true);
        webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
        webSetting.setSupportZoom(true);
        webSetting.setBuiltInZoomControls(true);
        webSetting.setUseWideViewPort(true);
        webSetting.setSupportMultipleWindows(true);
         webSetting.setLoadWithOverviewMode(true);
        webSetting.setAppCacheEnabled(true);
        // webSetting.setDatabaseEnabled(true);
        webSetting.setDomStorageEnabled(true);
        webSetting.setGeolocationEnabled(true);
        webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
        // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
        webSetting.setAppCachePath(getContext().getDir("appcache", 0).getPath());
        webSetting.setDatabasePath(getContext().getDir("databases", 0).getPath());
        webSetting.setGeolocationDatabasePath(getContext().getDir("geolocation", 0).getPath());
        webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
//         webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
        webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);

        //增長
//        webSetting.setTextSize(WebSettings.TextSize.NORMAL);
        //支持混合模式
//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//            webSetting.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
//        }
        //接口禁止(直接或反射)調用,避免視頻畫面沒法顯示:
//        setLayerType(View.LAYER_TYPE_SOFTWARE,null);
//        setDrawingCacheEnabled(true);
        // this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
        // settings 的設計
        CookieSyncManager.createInstance(getContext());
        CookieSyncManager.getInstance().sync();

 

 

  接入之後遇到一些詭異的問題:

1.小窗有些手機上沒法使用,發現是清單文件聲明少了致使的

2.發現攔截無網絡的errordes和webview的不一樣

3.發現極簡的app,在首次加載網頁會出現加載不出來的問題,通過調試發現原來是x5webview尚未初始化完成,就在activity中調用了x5webview致使的,因此必定要注意預加載的回調。

4.關於線上問題的查漏補缺,記得帶上x5webview的版本號

 

 

 騰訊x5webview官網

騰訊x5webview論壇交流

相關文章
相關標籤/搜索