本文将围绕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
- 大小: 200.8 KB
分享到:
相关推荐
Android 2.3 WebKit流程分析图
Android4.1 WebKit流程分析图包括 详细的网络请求流程,下载流程,代理流程
WebKit内核源码分析_ALL
本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析的时候以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。在分析内核的时候,Frame是首当其冲的一个类,本文将分析...
android_webkit android_webkit android_webkit android_webkit android_webkit android_webkit android_webkit android_webkit android_webkit
android4.0.1 webkit 系列文章所有图。
Android ICS webkit移植分析
java集成webkit浏览器,内附详细Demo,注意64位需要用64位swt
Android 浏览器(基于WebKit)的源代码
关于android的webkit的介绍,包括各个类之间的关系,写的非常不错,希望大家参考
本系列通过分析WebKit的源代码,试图分析WebKit的内核设计架构,模块之间的关系,分析时以QT的移植为参考,涉及移植的东西不多,主要还是以内核为主。FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常...
用mingw编译好的qtwebkit组件
Android WebKit HTML主资源加载过程
基于Webkit的新手级浏览器源码是一个简易web浏览器,基于安卓Webkit开发的。
webkit的代码分析资料。包括很多介绍webkit的资料
webkit开发学习笔记(全面)_第一版 webkit内核源代码分析(1)
Webkit,Android Brower的主要类图和时序图
浏览器的请求一般是以页面请求为单位,当用户通过网址栏输入一个url,浏览器就开始一个页面请求。而一个页面请求可能包含有一个到多个页面子帧,...Page类是WebKit中非常重要的一个类,它就象内核对外的一个聚合器。
关于 Android Webkit的一些原理性应用