Android 4.4 webview 架构

来源:互联网 发布:如何查看淘宝客pid 编辑:程序博客网 时间:2024/06/02 04:30
通过这两天对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 WbViewAndroid AOSP






















Chrome Project
AwContents







ContentBrowser Components







Blink
上图所示的代码结构如下:

      modulecode pathfunctionandroid.webkit.WebViewframeworks/base/corewebview interfaceandroid.webview.chromiumframeworks/webviewWebViewChromium,the bridge from AwContents to WebVieworg.chromium.android_webviewexternal/chromium_org/android_webviewAwContents,the Proxy of Chromium ContentView
org.chromium.content.browserexternal/chromium_org/content/publicChromium 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


原创粉丝点击