本文将围绕android平台webkit组件中,java层的几个主要类进行分析,说明各个类的职责以及类之间的关系。若有错误疏漏之处,望不吝指出。

(源码所在目录  ${framework_sourcecode_loc}\core\java\android\webkit )



一、概述
Android平台webkit组件java层封装了一系列浏览网页相关的功能,对开发者而言,主要功能有以下两点:

1、接收上层请求(eg:loadUrl, goBack, reload...),并将请求委托给底层模块(so库)处理

2、将处理的中间过程和结果通过回调接口通知上层(eg:onPageStarted, onPageFinished, shouldOverrideUrlLoading...)

 

 

二、主要功能类介绍

1、类层次

自顶向下依次为:

WebView

WebViewProvider, WebViewClassic

WebViewCore, EventHub, CallbackProxy

BroswerFrame

 

(说明:层次划分的依据是类之间的创建和调用关系,不一定非常严格,可能由于业务逻辑需要,会出现底层调用上层的情况,例如:BroswerFrame会调用CallbackProxy中定义的接口)

 

 

2、类之间关系


在介绍类之间关系之前,有两点需要先说明:
a、函数根据调用发起者的层次关系,分为上层请求 和 底层回调两种。
上层请求函数包括:
loadUrl, goBack, reload 等
底层回调函数包括:
onPageStarted, onPageFinished, shouldOverrideUrlLoading 等

b、函数可能在UI线程执行,也可能在WebCore线程执行。
UI线程:即创建Framework WebView组件所在线程
WebCore线程:native层通过jni调用java函数所在线程( 即调用WebViewCore类initializeSubwindow的线程)


在主要功能类中,函数可以根据功能划分,分为3类:
  • 业务逻辑相关
  • View显示相关
  • Scroll控制相关
下面以业务逻辑相关的函数为例,说明各个类之间的关系: (蓝色表示调用执行在UI线程,红色表示执行在WebCore线程)

     上层请求路径:(loadUrl, goBack, reload)
     WebView->WebViewClassic->WebCore->WebCore.EventHub->BrowserFrame->native
     底层回调路径:(onPageStarted, onPageFinished, shouldOverrideUrlLoading)
     native->BrowserFrame->CallbackProxy->CallbackProxy.Handler->WebViewClassic/WebViewClient/WebChromeClient     

调用关系图如下图:

(图中,蓝色箭头表示调用在UI线程执行,红色表示在WebCore线程执行,蓝色圆角矩形表示类,红色圆角矩形表示接口)

 

类调用关系图

 

 

 

3、执行线程及线程间通信
由上图可以看出,在WebViewCore和CallbackProxy层以上,函数在UI线程执行,以下在WebCore线程执行。
对上层开发者而言,WebCore线程是透明的,不需要考虑线程同步的问题,所有对上层接口的回调事件都已经由CallbackProxy抛回UI线程处理。
线程间通信是通过Framework android.os.Handler类实现,EventHub和CallbackProxy类分别负责 UI->WebCore 和 WebCore->UI 的消息传递。

 

4、其他

CallbackProxy类其实包含两个功能:

a、对WebViewCore而言,CallbackProxy用于请求上层对某些事件做处理,是一种主动的调用请求

b、对于BroswerFrame而言,CallbackProxy用于将中间过程和结果回调上层,是一种状态的回调

看代码的过程中,总感觉这里分为两个类会更清晰一点。具体是不是违反了SRP原则,就见仁见智了。

(其实webkit java层代码基本没有真正的业务逻辑处理,业务逻辑都在native层,后续会补上对native层代码的分析)

 

THX



 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐