您的位置:首页 > 移动开发 > Android开发

Android平台webkit组件java层代码分析

2013-09-02 22:56 375 查看
转自ITeye:
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分析

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: