本文将围绕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-15源代码"是Android SDK的一个重要组成部分,它提供了Android 4.0.4(API级别15)的原始源码,为开发者提供了宝贵的参考资料。本文将对这个源代码进行深入的剖析,帮助读者理解Android系统的基石。 一、...
在Android操作系统中,WebKit是一种关键的组件,它负责处理网页内容并提供渲染引擎,使应用程序能够展示和交互与基于Web的界面。Android的WebKit内核是开源项目WebKit的分支,它为Android平台提供了浏览网页和其他...
在安卓(Android)平台上开发基于原生代码的浏览器是一项复杂且技术性强的工作。这份"基于安卓Android的浏览器源码.zip"资源提供了深入了解Android浏览器开发的机会,对于学习和研究Android系统、网络编程以及移动...
《Android源码分析精典》一书主要涵盖了Android操作系统的核心组成部分和源码结构,对于深入理解Android系统的运行机制以及进行系统级开发具有重要的参考价值。下面将详细解析书中的关键目录及其内容。 1. **bionic...
在Android上,WebKit与Android系统的交互通过Android WebKit库实现,这个库提供了Java接口供应用程序调用,如WebView组件。WebView允许开发者在应用中嵌入网页内容,并可以执行JavaScript代码。 5. 多进程架构: ...
现在,让我们逐个目录地分析Android源码的主要组成部分。 1. **bionic**: bionic目录包含了Android的基础C库,如libc(C库)、libdl(动态链接库)、libm(数学库)、libstdc++(标准C++库)以及libthread_db和...
在Android平台上,开发一款基于Webkit的新手级浏览器是一个很好的学习实践项目,因为这涉及到Android系统的核心组件之一——Webview,以及对Webkit渲染引擎的理解。Webkit是开源的,被广泛用于移动设备上的浏览器,...
《Android浏览器代码分析:深入理解Browser机制》 在Android系统中,内置的Browser应用是用户访问互联网的重要途径。本文将通过详细的代码分析,配合UML(统一建模语言)图,帮助开发者深入理解Browser的工作原理,...
Android系统作为全球最流行的开源移动操作系统,其源代码的深入理解和分析对于开发者来说至关重要。Android源代码包含了整个系统的各个方面,包括内核、库、框架服务、用户界面以及应用程序。本讲解将围绕如何将...
通过分析Android 2.3 Browser的源码,开发者可以深入理解Android系统的网络通信、UI设计、性能优化等方面的知识。这对于开发自定义浏览器应用或者对现有浏览器进行扩展和优化非常有帮助。例如,可以研究如何增强隐私...
Android 4.0 Browser源码分析 Android 4.0,也称为Ice Cream Sandwich (ICS),是Android操作系统的一个重要版本,引入了许多用户界面和功能改进。在这个版本中,内置的Browser应用进行了重大更新,提供了更流畅的...
2. **junit**:JUnit是一个流行的Java单元测试框架,用于测试Android代码的正确性。 3. **com**、**android**、**org**、**mock_android**、**java**、**javax**:这些是Java包结构,包含了Android系统的各个组件和...
源码展示了如何使用XML布局文件定义UI元素,以及如何在Java代码中动态控制这些元素的显示和隐藏,同时,源码还揭示了如何处理用户的触摸事件,实现滑动翻页等功能。 此外,Zirco-Browser还包含了隐私保护和安全特性...
通过分析Android 12的源码目录,我们可以了解系统是如何组织的,以及新版本中可能的改进。这有助于开发者理解和定制Android系统,同时也能帮助我们预测未来版本的发展趋势。在实际学习中,深入研究每个子目录的代码...
《安卓Android源码——Zirco浏览器源码分析》 在深入探讨安卓Android源码的广阔领域时,我们经常会遇到各种开源项目,其中Zirco浏览器是一个值得研究的例子。Zirco浏览器是一款基于Webkit内核的开源浏览器,它为...
- `/android`:这是专门为 Android 平台设计的部分,包含了 JNI (Java Native Interface) 目录,用于 WebKit 与 JavaVM 的交互,通过 Bridge 类进行协调处理。 - `/plugins`:提供了 Android 平台的插件支持。 - ...
通过研究和分析Android 2.3的源码,开发者不仅可以学习到Android系统的基本架构,还可以了解到早期移动平台的开发历程和设计理念。这对于深入理解Android系统、编写高效和安全的应用程序、或者开发基于Android的定制...