android系统浏览器源码剖析
2015-09-06 21:37
447 查看
安卓原生浏览器源码剖析
整理:joeyyin@outlook.com
2012-10
Browser in Android_4.0.3_r1。
调试方法参考本人另一篇笔记《Android 源码编译与调试》。
本文的源码跟踪是基于Windows+Eclipse下进行。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/58fb7548993de0e0adfa4b8be1849abd)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/8ef441d2727f6408ed09beaab994e07e)
其中Controller是核心控制类,实现了UI控制接口,WebView控制接口,Activity的框架回调函数实际也调用Controller的方法进行处理。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/7c357e11d1e170b5265b869238fcf56d)
不同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组件,启动控制组件。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/cee2c1f9fba30b49bd7ee0c5a88a946d)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/71ad904eede7a020338c846a95737815)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/b123f42e6df692ad616d5fd7baefe550)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/0de9ee2bd651ee190732a120d6c62ff3)
浏览历史操作通过DataController进行处理。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/2f9dfd64ccd83160fbe8a96d8ca7fbce)
由于操作涉及数据库读写,真正的操作在DataController的DataControllerHandler线程中进行处理。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/0d5be7940b4da3f62ab45dce9d2a558c)
数据的读写通过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进行下载处理。
浏览器端的处理如下:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/1114d9cb068df78b8aefad1840cb48d1)
通过DownloadManager.enqueue将下载信息提交给provider:content://downloads/my_downloads
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/d5a95bb4d6722d8c64c651538dcc6b7d)
对于Download Provider的调试。
先设置调试进程,由于downloadprovider使用了android.process.media,选择android.process.media。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/7ca5e73d559d93a0710d6122be83ba22)
每个下载由一个下载线程处理
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/9ff6856911501f1a0c54524d43909675)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202001/05/2995ca463f5d0b339cd5ca2db5e60698)
TODO…
安卓的主线程用于UI控制,一般可能被阻塞或者耗时长的操作不能在主线程进行处理,需要使用异步任务进行处理。
BackgroundHandler提供了两种独立的异步任务执行模式:
HandlerThread 是一个具有Looper的线程,可以使用此Looper创建handler,handler实现对于Message的处理,执行在HandlerThread线程环境中。事件发送的先后顺序串行执行。
ExecutorService 是一个可以并行执行多任务的线程池。多个可执行任务可能并行执行。
DataController中保持了一个具有MessageQueue的DataControllerHandler(线程),工作原理类似于标准的handler/message/thread/looper。
在DataController中同时创建了一个mCbHandler,处理需要在主线程中处理的回调事件。
直接创建一个thread,运行Runnable对象。
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可理解为数据(对象)及数据(对象)的存储。
其他一些局部应用的模式有:
工厂模式
适配器模式
观察者模式
整理: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可理解为数据(对象)及数据(对象)的存储。
其他一些局部应用的模式有:
工厂模式
适配器模式
观察者模式
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析