Android平台webkit组件java层代码分析
2013-09-02 22:56
375 查看
转自ITeye:
constGU
本文将围绕android平台webkit组件中,java层的几个主要类进行分析,说明各个类的职责以及类之间的关系。若有错误疏漏之处,望不吝指出。
(源码所在目录 ${framework_sourcecode_loc}\core\java\android\webkit )
1、接收上层请求(eg:loadUrl, goBack, reload...),并将请求委托给底层模块(so库)处理
2、将处理的中间过程和结果通过回调接口通知上层(eg:onPageStarted, onPageFinished, shouldOverrideUrlLoading...)
WebView
WebViewProvider, WebViewClassic
WebViewCore, EventHub, CallbackProxy
BroswerFrame
(说明:层次划分的依据是类之间的创建和调用关系,不一定非常严格,可能由于业务逻辑需要,会出现底层调用上层的情况,例如:BroswerFrame会调用CallbackProxy中定义的接口)
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线程执行,蓝色圆角矩形表示类,红色圆角矩形表示接口)
对上层开发者而言,WebCore线程是透明的,不需要考虑线程同步的问题,所有对上层接口的回调事件都已经由CallbackProxy抛回UI线程处理。
线程间通信是通过Framework android.os.Handler类实现,EventHub和CallbackProxy类分别负责 UI->WebCore 和 WebCore->UI 的消息传递。
a、对WebViewCore而言,CallbackProxy用于请求上层对某些事件做处理,是一种主动的调用请求
b、对于BroswerFrame而言,CallbackProxy用于将中间过程和结果回调上层,是一种状态的回调
看代码的过程中,总感觉这里分为两个类会更清晰一点。具体是不是违反了SRP原则,就见仁见智了。
(其实webkit java层代码基本没有真正的业务逻辑处理,业务逻辑都在native层,后续会补上对native层代码的分析)
参考: WebKit for Android分析
constGU
本文将围绕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层代码的分析)
参考: WebKit for Android分析
相关文章推荐
- Android平台webkit组件分析
- Android平台webkit组件分析
- 深入了解android平台的jni的原理以及本地多线程调用java代码
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
- 深入了解android平台的jni---本地多线程调用java代码
- 【代码】Android和java平台 DES加密解密互通程序及其不能互通的原因
- 想做一个整合开源安全代码扫描工具的代码安全分析平台 - Android方向调研
- Android RIL 原生代码(c/c++) 和 java代码部分分析
- 深入了解android平台的jni---本地多线程调用java代码
- Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用
- Android平台Java代码的条件编译问题
- Unity调用android平台java代码
- 如何分析android的OOM,与java静态代码分析工具
- 几十行Java代码轻松Android平台的视频开发
- 【Java&Android开源库代码分析】のandroid-async-http の开盘
- 【转载】Android在Java代码中实现margin(实现组件间间隔)
- 如何分析android的OOM,与java静态代码分析工具
- 深入了解android平台的jni---本地多线程调用java代码
- Android疯狂讲义学习笔记——XML布局和java代码共同控制用户界面组件
- Java平台下著名的POI组件下的excel导出功能代码。