在對基于Cordova的Android混合App的性能優化過程中,遇到了很多在不同安卓版本手機上的Bug,很多都是安卓不同版本的系統webview的差異導致的,有可能是安卓系統的問題,也有可能是手機廠商修改webkit帶來的問題,這些問題從前端技術層面是很難解決的,修改和測試成本都非常高。因此我想通過使用統一webkit內核的大招來解決,目前有2個方案可選,使用Crosswalk內核或騰訊瀏覽服務X5內核。本文主要研究Cordova整合使用騰訊瀏覽服務X5內核。
問題背景
熟悉Cordova生態圈的朋友可能聽說過Crosswalk,Crosswalk是Intel維護的Webkit開源項目,可以通過插件安裝命令cordova plugin add cordova-plugin-crosswalk-webview
安裝,它的缺點就是太大了,集成后apk會增加20M,安裝后會占用50M空間,因此一般不推薦普通App使用Crosswalk。
然后我就找到了騰訊瀏覽服務X5,它是直接使用微信/手機QQ/空間的X5瀏覽器內核的,SDK只有250k,因此可以放心使用。鑒于這幾個產品國內廣泛的裝機量,用戶覆蓋方面不用擔心,如果微信/手機QQ/空間都沒有安裝,會自動降級到系統瀏覽器內核,或提示用戶安裝X5內核。
騰訊X5內核介紹
X5SDK是通過調用微信/手機QQ/空間的X5內核,解決系統webview兼容性差、加載速度慢、功能缺陷等問題,開發接入便捷,大小只有253K,僅需幾行代碼,即可解決一切令開發者們頭疼的問題,為用戶提供最優秀的瀏覽體驗。
同時,QQ瀏覽器團隊還將持續更新和優化X5內核,持續優化功能,并保證兼容各種web新特性。
其相對于系統webview,具有下述明顯優勢:
- 速度快:相比系統webView的網頁加載速度有近30%的提升。
- 省流量:云端優化技術使流量節省20%
- 更安全:24小時安全問題解決機制
- 更穩定:經過億級用戶的使用考驗,CRASH率0.15%
- 集成強大的視頻播放器,支持各種視頻格式直接打開
- 適屏排版、字體設置等瀏覽增強功能的提供
- Html5更完整支持。
- 無系統內核的碎片化問題,更少的兼容性問題
Cordova整合騰訊X5內核
騰訊瀏覽服務官方只提供了如何把系統Webview替換成X5的接入文檔,并沒有提供Cordova集成的方法,論壇里有人問這個問題也沒有官方回復。現在項目里面用了很多Cordoca插件提供拍照,掃二維碼,App支付寶支付等功能,因此就需要把cordova和x5結合起來。
Cordova框架現在已經很完善,Cordova的Web Engine也是基于接口開發的,因此我參考系統engine的實現,寫了一個x5engine插件,解決了Cordova調用X5內核的問題。
后面我會把這部分功能做成了一個Cordova插件,方便大家使用,github地址https://github.com/offbye/cordova-plugin-x5engine-webview。
遇到的問題
64位手機上加載包含x5 so文件的插件報錯
TBS:initX5Core -- loadSucc: false; exception: java.lang.reflect.InvocationTargetException; cause: java.lang.UnsatisfiedLinkError: dlopen failed: "/data/data/com.tencent.mm/app_tbs/core_share/libmttwebview.so" is 32-bit instead of 64-bit
解決辦法是在armeabi增加一個32位的jni so, 隨便弄個小一點的so加上就可以,如果已經用了其它的JNI so應該不會有這個錯誤。X5內核不支持file://本地域url,但支持本地相對路徑。