相信关注Android 平台开发的大家已经观察到Android 4.4及其以上WebView的默认实现从Webkit变更为chromium, 这对使用Android WebView来说是利好消息,基于chromium的WebView性能更好更流畅,并且AOSP已经做了老版本API兼容,不需要我们的应用程序做任何修改就能运行在Android 4.4上。本文介绍Chromium for WebView的实现代码结构。其实现分为两部分,一部分是Android WebView的Framework 以及public API 还有一部分是WebView的实现核心Chromium 下面这幅图展示这两种之间的关系以及上下结构。
(1)定义Public API(WebView,WebViewSettings, etc)
(2) 定义包内部隐藏类 WebViewFactoryProvider,WebViewProvider
(3)定义各种"POD(plain old data)“数据类型,用户在应用程序与 WebView实现间传递的数据类型。比如URLUtil类。
(4)定义一些WebView 的具体实现代码
(1)glue 层代码,桥接Android WebView Framework 和 external/chromium_org
(2)在java部分这是chromium WebViewFactory的主要入口。
(3)这个目录下实现代码的目标是仅仅依赖android_webview的public API(部分除外,比如ThreadUtils,LibraryLoader,etc).并且不包含复杂逻辑。仅仅保持glue层状态。
这部分代码提供平台支持,native support library绑定少部分android_webview/public api的副本(GL functor, skia bitmap访问utilities)
Chromium Tree side
1.android_webview/java
(1)chromium 的顶层入口部分。
(2)在Chromium 代码基础上提供一层wrapper/semi来向下兼容Android系统版本。
这部分代码通过JNI对应到native部分代码 android_webview/native 目录下.
2.android_webview/native
(1)这个目录的代码更应该叫JNI部分代码,这一层代码只是android_webview/java与native代码的衔接层代码。类的命名基本是java层类的副本映射,并且承当的作用也是相同的。
(2)此目录存在可以存放避免复杂的实现逻辑,减轻android_webview/browser的压力或者 components压力
(3)这部分代码必须和WebView 的Public API运行在同一线程,WebView Public API运行在UI 线程,因此这部分的代码功能也必须运行在UI 线程。与BrowserThread 或者IPC 渲染线程 这种重要的交互代码放在browser目录之下。
3.android_webview/browser
(1)这个目录代码实现浏览等重要的特性功能。
(2) 需要复杂与native 线程交互的代码需要在此封装。
(3) 为了模块化以及模块测试,在这部分代码没有静态强制依赖上层代码 (android_webview/native)层代码。
4.android_webview/renderer
包含所有在渲染进程中运行的逻辑代码。目前WebView只支持单进程渲染,browser/renderer保持分离,这是个非常实用的架构,分离java应用程序部分与web platform代码,避免两者偶尔,相互独立更稳定。
5.android_webview/lib
这个目录下主要是libwebviewchromium.so的入口,没有其他模块依赖这目录下代码。
6.android_webview/common
声明一些raw type 提供给android_webview/browser 和 android_webview/renderer。
WebView采用单进程模式,优势可以共享全局状态。这里也定义每个IPC的类型声明。
7.android_webview/public
(1)定义导出native部分的抽象接口,为关注在Java不能实现的重要的性能检测(比如渲染)
(2)使用Android Framework内部工具来实现高性能后台兼容的custom view。
8.android_webview/unittestjava
主要测试JNI部分代码