CAW的个人总结

  由于工作的需要,最近正在忙的进行Chromium的移植,作为新人,首先需要学习研究基础的东西,由于是基于android 平台的,所以首先需要了解的就是WebView这个控件是如何和底层chromium内核交互的。在工作之余,把最近工作学习的内容总结下来,以供学习记忆。

                   Android Chromium for WebView代码结构
   
    Chromium for WebView的实现代码结构。其实现分为两部分,一部分是Android WebView的Framework 以及public API 还有一部分是WebView的实现核心Chromium 下面这幅图展示这两种之间的关系以及上下结构。




Android Tree side

1.frameworks/base -- core/java/android/webkit/
(1)定义Public API(WebView,WebViewSettings, etc)
(2) 定义包内部隐藏类 WebViewFactoryProvider,WebViewProvider
(3)定义各种"POD(plain old data)“数据类型,用户在应用程序与 WebView实现间传递的数据类型。比如URLUtil类。
(4)定义一些WebView 的具体实现代码
2.frameworks/webview -- chromium/java
(1)glue 层代码,桥接Android WebView Framework 和 external/chromium_org
(2)在java部分这是chromium WebViewFactory的主要入口。
(3)这个目录下实现代码的目标是仅仅依赖android_webview的public API(部分除外,比如ThreadUtils,LibraryLoader,etc).并且不包含复杂逻辑。仅仅保持glue层状态。
3.frameworks/webview -- chromium/plat_support
   这部分代码提供平台支持,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系统版本。
 (3)WebView的大部分API实现的后台支持由Chromium content    module(http://dev.chromium.org/developers/content-module)以及附属的components  browser (http://dev.chromium.org/developers/design-documents/browser-components)
这部分代码通过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部分代码

                                            
   总的来说 Android WebView 适配的代码大概可以分作两部分,一部分属于 Chromium source tree,一部分属于 Android source tree。
   只属于 Android source tree,不属于 Chromium source tree 的代码,分别位于 AOSP 源码树的 frameworks/base/core/java/android/webkit 和 frameworks/webview 目录下。
    frameworks/base/core/java/android/webkit 主要为第三方应用提供公开的 WebView API,它的代码包括:
 Android SDK 对外公开的 WebView API,包括 WebView,WebViewClient,WebChromeClient,WebSettings 等; 
 私有接口类,包括 WebViewProvider,WebViewFactoryProvider,这些接口供内部实现; 
 一些用于参数传递的简单数据结构(比如 WebViewTransport)和辅助类(比如 URLUtil); 
    frameworks/webview 是 Android WebView API 与 Chromium Content 层之间的 glue layer,它隔绝了 frameworks/base 和 external/chromium_org 代码之间的相互依赖,它实现了 frameworks/base 下的 WebViewProvider 等接口,将 WebView 发送过来的请求转发给 Chromium,并通过注册回调的方式为 Chromium 提供一些必须使用 Android 非公开 API 的代码。
   Chromium 的代码位于 AOSP 源码树的 external/chromium_org 目录下,它是 Chromium 代码仓库某个分支的一个 Clone,其中 android_webview 子目录下就是 Chromium 为 Android WebView 这个 Platform Configuration 适配的代码(如果是为 Android 平台适配的代码,一般位于各个模块的 android 子目录下,这部分是 CAW 和 Chrome for Android 共用的)。Chromium 的代码可以使用标准的 Android SDK/NDK 编译,它不依赖于上面列举的 Android source 的部分,是完全独立的,甚至代码里面还包括了一个 TestShell 可以进行简单的测试(external/chromium_org/android_webview/test)。

个人的想法总结(难免理解有出入,时时纠正更新):
   针对Android WebView在frameworks层的代码,WebView是由WebViewProvider实现,而WebViewProvider是接口,WebViewProvider由WebViewChromium实现,WebViewFactory和WebViewFactoryProvider是由WebViewChromiumFactoryProvider的实现。(其实WebViewFactory通过反射创建WebViewChromiumFactoryProvider,但我并不知道反射是什么?)
   WebSettings的接口,Android 4.4做了chromium 的桥阶层,主要涉及的WebSettings相关代码在ContentSettingsAdapter,AwSettings中。

 目前已经将几个重要的流程追踪了一下,已经将WebView这部分代码提上来,开始做项目,主要的难点就是与底层的对接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值