Android(安卓)4.4 webview 架构
16lz
2021-01-24
通过这两天对4.4 webview的调研发现,4.4 google已经将android原来的webview主要实现都去掉了,但是作为系统级的frameworks,要考虑到向后兼
容,API是不能随便乱动的,所以framework/base下面webview中留下了提供给上层接口的一些类文件。
对Anrdoid webview实现取而代之的是chromium项目的webview,通过桥接的方式将chromium的中webview的实现和framework base的webview接口相联
系,主要结构如下:
上图所示的代码结构如下:
根据上述图表信息可以看到4.4 webview的实现最终转移到chromium的ContentView来进行,在ContentView所在的模块最终调用native的内核对网页进行渲染。
形象的理解上述流程从一个loadUrl来看,详细流程如下:
Browser.loadUrl ------> WebView.loadUrl -------> WebViewChromium.loadUrl --------> AwContents.loadUrl ------> ContentViewCore.loadUrl
容,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
更多相关文章
- 【Android】Could not find XXX.apk!的解决方法
- Android(安卓)的启动流程
- Android(安卓)ROM包制作
- APK的安装过程及原理详解
- Android(安卓)进程和线程(二)
- Android中的线程和线程池
- Android显示gif格式图片
- Android(安卓)Studio引入Kotlin插件
- Android基础知识整理