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

android系统浏览器源码剖析

2015-09-06 21:37 447 查看
安卓原生浏览器源码剖析

 

整理:joeyyin@outlook.com

2012-10

 


源码及调试

Browser in Android_4.0.3_r1。

调试方法参考本人另一篇笔记《Android 源码编译与调试》。

本文的源码跟踪是基于Windows+Eclipse下进行。


总体结构



 


核心类



其中Controller是核心控制类,实现了UI控制接口,WebView控制接口,Activity的框架回调函数实际也调用Controller的方法进行处理。

 


界面布局



 

不同Tab仅WebView及其wrapper或由WebView触发生成的View是不同的,在PhoneUi.setActiveTab ()切换:

Webview_wrapper中的webview切换,

PhoneUi.removeTabFromContentView

PhoneUi.attachTabToContentView

 


主要处理流程


初始化

APP初始化

Browser.onCreate(),创建及初始化应用范围内的全局对象。通常这些对象以单件形式提供,不依赖于ActivityContext。

创建CookieSyncManager

创建初始化BrowserSettings

创建初始化Preloader

 

BrowserActivity初始化

BrowserActivity.onCreate(),创建相关控制组件,创建UI组件,启动控制组件。

 




创建Tab




打开网页





 


功能模块


浏览历史

浏览历史操作通过DataController进行处理。



 

由于操作涉及数据库读写,真正的操作在DataController的DataControllerHandler线程中进行处理。



数据的读写通过provider: ” content://com.android.browser/history”进行。

 

 


书签

原生浏览器书签由provider提供:com.android.browser.provider.BrowserProvider2

路径” content://com.android.browser/bookmarks” or “content://browser/bookmarks”

 

BrowserProvider2.onCreate()调用createDefaultBookmarks()从配置文件中初始化预制书签。


主页

TODO…

 


下载

调用DownloadManager进行下载处理。

浏览器端的处理如下:



 

通过DownloadManager.enqueue将下载信息提交给provider:content://downloads/my_downloads



 

对于Download Provider的调试。

先设置调试进程,由于downloadprovider使用了android.process.media,选择android.process.media。



 

每个下载由一个下载线程处理





 

TODO…

 


异步任务

安卓的主线程用于UI控制,一般可能被阻塞或者耗时长的操作不能在主线程进行处理,需要使用异步任务进行处理。


BackgroundHandler

BackgroundHandler提供了两种独立的异步任务执行模式:

HandlerThread   是一个具有Looper的线程,可以使用此Looper创建handler,handler实现对于Message的处理,执行在HandlerThread线程环境中。事件发送的先后顺序串行执行。

 

ExecutorService    是一个可以并行执行多任务的线程池。多个可执行任务可能并行执行。


DataController

DataController中保持了一个具有MessageQueue的DataControllerHandler(线程),工作原理类似于标准的handler/message/thread/looper。

 

在DataController中同时创建了一个mCbHandler,处理需要在主线程中处理的回调事件。

 


Thread

直接创建一个thread,运行Runnable对象。

 


AsyncTask

AsyncTask简化了UI线程及异步任务线程间自动同步。

 

 


异步执行反馈

异步执行的结果通常需要在UI线程中体现在UI方面。通过handler.sendmessage()进行。

 


总结

Thread/AsyncTask 主要应用在一些临时的局部异步任务处理。 Thread/AsyncTask太多可能造成系统中过多的不可控任务及执行线程。对于异步任务建议尽可能进行类似于BackgroundHandler及DataController的封装。


设计模式

从总体结构及核心类可以看出,原生浏览器主要采用MVC架构。

View即PhoneUI、WebView、TitleBar等UI组件。

Controller即Controller、TabController、各种Handler等。

关于Model:

在分析浏览器的主流程,即加载页面流程时,会很难找到Model。由于主要的数据处理已经由WebKit完成,应用需要处理的主要是加载进度、标题等信息显示。这里的信息一般直接以Data的形式提供,而无需进行Model化。

但MVC模式同样也应用于多Tab、书签、浏览历史等处理中。在这些流程中Tab,BookMark,History等通常是封转了数据的Model。

Model可理解为数据(对象)及数据(对象)的存储。

 

其他一些局部应用的模式有:

工厂模式

适配器模式

观察者模式

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