容,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