Android 4.4 webview 架構

通過這兩天對4.4 webview的調研發現,4.4 google已經將android原來的webview主要實現都去掉了,但是作爲系統級的frameworks,要考慮到向後兼

容,API是不能隨便亂動的,所以framework/base下面webview中留下了提供給上層接口的一些類文件。

   對Anrdoid webview實現取而代之的是chromium項目的webview,通過橋接的方式將chromium的中webview的實現和framework base的webview接口相聯

系,主要結構如下:

      


Android.webkit.WebView








Bridge from AwContents to WbView
Android AOSP






















Chrome Project
AwContents








Content Browser Components








Blink

上圖所示的代碼結構如下:

     
module code path function
android.webkit.WebView frameworks/base/core webview interface
android.webview.chromium frameworks/webview WebViewChromium,the bridge from AwContents to WebView
org.chromium.android_webview external/chromium_org/android_webview AwContents,the Proxy of Chromium ContentView
org.chromium.content.browser external/chromium_org/content/public Chromium ContentView

根據上述圖表信息可以看到4.4 webview的實現最終轉移到chromium的ContentView來進行,在ContentView所在的模塊最終調用native的內核對網頁進行渲染。

形象的理解上述流程從一個loadUrl來看,詳細流程如下:

Browser.loadUrl  ------>  WebView.loadUrl  ------->  WebViewChromium.loadUrl   -------->  AwContents.loadUrl  ------>  ContentViewCore.loadUrl

從Browser APP調用loadUrl之後依次經過上面表格中的四個模塊的調用,最終結束了WebView的內部流程,最後在ContentViewCore.中調用nativeLoadUrl從而調到內核的具體實現中。


上面這個loadUrl是一個比較簡單調用流程的例子,在一些比較複雜的調用流程在org.chromium.content.browser的類中還會去調用chromium_org下面的其它類的實現,比如調用base下面的基本類庫等等。


Chromium WebView使用的webkit內核的代碼在external/chromium_org/third_party/WebKit目錄下,Chromium_org目錄下面會有java以及C/C++的Code,在java層中調用的native方法會在對應目錄下的C code文件中實現。


JNI的實現在4.4中使用Chromium中的Python腳本進行自動生成JNI相關的文件,java向native層的調用方法前面會帶有native字樣,如nativeLoadUrl,

而native層調用java層的方法會有@CallByNative的註釋,python腳本會在編譯的時候根據這個註釋自動的去生成JNI的相關的文件。

java層的native方法將方法名前面的native字樣直接去掉就是native層對應的該方法的實現,如Java層nativeLoadUrl  =====》 native層的loadUrl


有待繼續study.......


參考資料 http://mogoweb.net/archives/596

                 http://www.ituring.com.cn/minibook/705


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章