Android WebView:JavaScript 調用效率哪家強?

各種 JsBridge 調用效率的對比

以前在項目中需要實現一個在在WebView的H5頁面中點擊一個關鍵字跳轉到Native端的指定頁面的功能。當時Google了一下就采用了重載ShouldOverrideUrlLoading方法來實現這個功能。后來要優(yōu)化這一部分的功能,就專門用了一段時間來做了一些測試,對比?,F在把數據和結論放上來給大家參考參考。

現在大家常用的Web頁面和Native端通信的方式大概有6種,下面會針對這6種方式做下性能測試來選出最優(yōu)方案。

參測機型與系統版本:

  1. Moto Nexus6 OS:6.0.1
  2. 魅族3S OS:5.1.1
  3. 紅米1 OS:4.2.2

測試用例:

在 web 頁面上發(fā)起請求時記下當前的時間t,并通過 JsBridge偽協議將時間 t 傳遞給 Native端,Native端收到請求時記錄下當前系統時間t2。將t2-t所得的時候就是這次 web 端和 Native端通信的耗時。同樣操作執(zhí)行20次,通過平均時間來比較性能。

測試函數

1.ShouldOverrideUrlLoading

頁面請求代碼:


ShouldOverrideUrlLoading
ShouldOverrideUrlLoading

Native端通過重載ShouldOverrideUrlLoading方法進行攔截主資源請求,解析 JsBridge偽協議來獲得相關數據。

ShouldOverrideUrlLoading
ShouldOverrideUrlLoading

2.ShouldInterceptRequest

頁面請求代碼:


ShouldInterceptRequest
ShouldInterceptRequest

Native端通過重載ShouldInterceptRequest方法進行攔截子資源請求,解析 JsBridge偽協議來獲得相關數據。

Android 5.0以下系統版本提供的攔截方法:

ShouldInterceptRequest
ShouldInterceptRequest

Android 5.0及以上系統版本提供的攔截方法可以獲得更為豐富的頁面信息。在WebResourceRequest有如下方法:getUrl(),isForMainFrame(),hasGesture(),getMethod(),getRequestHeaders();其中getRequestHeaders()方法可以獲得的請求信息最多了。


ShouldInterceptRequest
ShouldInterceptRequest

3.Prompt方式

頁面請求代碼:


Prompt
Prompt

Native端重寫WebChromeClient的onJsPrompt方法拉處理偽協議請求:

Prompt
Prompt

4.Alert方式

頁面請求代碼:


Alert方式
Alert方式

Native端重寫WebChromeClient的onJsAlert方法拉處理偽協議請求:

Alert方式
Alert方式

5.Confirm方式

頁面請求代碼:


Confirm方式
Confirm方式

Native端重寫WebChromeClient的onJsConfirm方法拉處理偽協議請求:

Confirm方式
Confirm方式

6.Console方式

頁面請求代碼:


Console方式
Console方式

Native端重寫WebChromeClient的onConsoleMessage方法拉處理偽協議請求:

Console方式
Console方式

測試結果

數據如下圖:


測試結果
測試結果

測試結論

對比上圖數據,我們發(fā)現使用Confirm方式基本上是耗時最短和最穩(wěn)定的。如果你不需要更詳細的 web 端的信息,使用Confirm方式是性能最好的。但是如果你需要讀取 web 端的請求頭信息,以及是否是主 frame 發(fā)起的請求,你就必須使用子資源攔截方式(intercept方式)了。這些豐富的請求信息對以后權限控制拓展是必須的。

關于addJavascriptInterface

這篇文章從一開始就沒打算把 addJavascriptInterface 方式添加到對比的數據中,因為它在 Android4.2 之前的版本存在嚴重的安全漏洞。谷歌在 Android4.2 之后的版本才通過添加 @JavascriptInterface 注解的方式解決了該問題。這兩天又換了個角度思考了一下,該方式作為谷歌官方的 Webview 和 JavaScript 解決方案,肯定會比其他交互方式優(yōu)秀的地方。歷史的車輪滾滾向前,目前大多數用戶的系統版本都集中在4.4.2以上了,所以今天還是把這個方式做了個測試。測試數據也證實我的猜測,其時間間隔是最短的。所以,如果你的 App 只打算支持 Android4.2 版本以上的,就可以考慮這個官方解決方案了。


關于addJavascriptInterface 測試結果
關于addJavascriptInterface 測試結果

下集預告

下一篇會寫基于Confirm方式以及intercept方式的完整的 JS 交互,即包含了 Native調用 web 端的方法。
下篇已出,Android WebView:我是怎么和 JavaScript 互撩的?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容