Gears框架分析

来源:互联网 发布:适合java初学者的书 编辑:程序博客网 时间:2024/05/19 09:16

转贴请注明出处

 

一、Gears是什么
Gears是由Google公司开发维护的一个开源项目,该项目的目的是通过增强浏览器特性,使得支持强大的Web应用。
Gears的主要特点如下:
1. 使得Web应用程序可以非常自然的与桌面交互(Desktop)
2. 支持资源本地化(LocalServer)
3. 将访问的数据本地存储在关系数据库中(Database)
4. 高效的后端执行Javascript脚本(WorkerPool)

二、Gears框架
下图是从Google Gears Documentation中抓出来的,这篇有关Gears体系结构的文章,分析了在设计Gears时所考虑的一些有关数据传送和同步方面的问题,有些意思(http://code.google.com/apis/gears/architecture.html)。

如上图所示,网络链接的情况下,Web应用程序按照下列方向通信
Application UI->Data Switch->Server Data Layer->Internet
如果此时网络出现问题,则Data Switch模块会将数据暂存在本地数据库中,等网络可用时,再将这些缓存数据提交到服务器。过程如下:
Application-UI->Data Switch->Local Data Layer->Database->Sync Engine

从Gears的整体代码结构看,可以看出主要由下面几个方面组成:
1. 本地服务器,读取和存储离线程序资源
2. 小型数据库(SQLite),用于存储本地数据
3. 工作池,将本地数据与服务器后台同步
4. 桌面模型,让网络应用程序的操作与桌面程序紧密接合
5. 地理定位,让网络程序侦测到当前用户的位置信息

三、Gears的安全模型
Gears使用Same Origin Policy安全策略,即只有拥有相同SCHEME,HOST, PORT的URI才能互相访问资源。对于不同源之间的资源互访,目前还处于研究和开发中。
下面是Same Origin Policy的样列:
Compared URL                                                     Outcome     Reason
http://www.example.com/dir/page.html                   Success     Same protocol and host
http://www.example.com/dir2/other.html                 Success     Same protocol and host
http://www.example.com:81/dir2/other.html            Failure       Same protocol and host but different port
https://www.example.com/dir2/other.html               Failure       Different protocol
http://en.example.com/dir2/other.html                    Failure       Different host
http://example.com/dir2/other.html                        Failure       Different host (exact match required)
http://v2.www.example.com/dir2/other.html            Failure       Different host (exact match required)
当用户第一次使用Gears API时,会弹出权限对话框,让用户确认是否允许应用程序将数据存储在用户的硬盘上。对于拥有相同Origin的网站,一旦用户确认允许使用Gears API,则Gears会记住用户的选择,之后的操作不会再次提示
对于终端用户的数据安全,Gears并没有做任何特别的处理,这完全是依赖于操作系统本身的多用户保护机制。使得不同登录用户都有一份自己的私有Gears数据,并且不允许相互访问(这个功能依赖于操作系统)

四、代码框架分析
4.1 源码目录结构
gears/
         |-base
         |-blob
         |-canvas
         |-console
         |-database
         |-desktop
         |-factory
         |-geolocation
         |-httprequest
         |-image
         |-inspector
         |-installer
         |-localserver
         |-media
         |-notifier
         |-timer
         /-workerpool
third_party

Summary
Factory - 实例化Gears对象
Blob - 描述二进制数据
Canvas - 提供图片处理功能
Database - 提供SQL数据库,将数据存储在本机
Desktop - 提供访问桌面功能的接口
Geolocation - 提供获取用户地理位置信息的接口
HttpRequest - 提供HTTP请求的封装
LocalServer - 缓存应用程序资源,使得资源可以离线访问
Timer - 为WorkerPool中的工作线程提供定时器功能
WorkerPool - 提供异步运行Javascript代码的功能

4.2 Gears插件初始化
下面以Android平台下的Gears插件作为示例,描述几个主要功能模块的实现。由于Gears插件支持多个浏览器平台(Android, Firefox,IE,Chrome,Safari等),因此,对于每个Javascript对象的实现类都提供了对应的实现接口,并且以文浏览器名称作为实现类文件的结尾。比如Android平台上的插件使用NPAPI接口实现,则所有与本地插件相关的代码都是以xxx_np作为文件名称。

Gears提供了gears_init.js的初始化脚本,该脚本会根据不同的浏览器类型向浏览器引擎请求载入Gears插件。在Android中,当DOM对象的MIME类型为"application/x-googlegears",则会使得WebView动态加载gear动态库,并且创建Gears的Javascript对象。在gears_init.js脚本中首先会使用google={}创建一个空对象,然后使用google.gears = { factory : factory }创建google对象的gears属性。
Android的插件初始化工作在gears/base/npapi/module_android.cc文件中的NP_Initialize函数中完成。该函数做了下面几件事情:
a) 检测NP版本号和是否支持插件线程的异步调用
b) 将浏览器回调函数表使用线程本地化保存在分配的线程数据结构槽中(ThreadLocals)
c) 将当前线程注册为主线程
d) 如果使用类加载器,则会将指定的JAR包加载到虚拟机里
e) 清除垃圾文件
f) 在浏览器线程中创建消息队列(ThreadMessageQueue::GetInstance()->InitThreadMessageQueue())
g) 初始化HttpRequest对象(HttpRequestAndroid::InitJni())
h) 初始化插件设置对话框(InitializeSettingsDialogClickHandler())
i) 初始化LocalServer所需使用的URL拦截器(UrlInterceptAndroid::create)
j) 开启新线程检测是否有更新(LibUpdater::StartUpdateChecks())

4.3 创建Gears Javascript对象
当插件初始化完毕后,会使用NPP_New接口创建一个NPObject实例,在NPP_New函数的实现方法中,使用CreateGearsFactoryWrapper函数创建了第一个全局Gears Javascript对象(factory),该对象的内部名称为GearsFactoryImpl,它定义了5个方法:hasPermission,version,create,getBuildInfo以及getPermission。所有的其他Gears对象,都是由该工厂对象的create方法创建的。
目前支持的属性对象有:
beta.database                 GearsDatabase
beta.desktop                   GearsDesktop
beta.failblob                    GearsBlob ( debugging )
beta.geolocation              GearsGeolocation
beta.httprequest              GearsHttpRequest
beta.localserver               GearsLocalServer
beta.timer                        GearsTimer
beta.workerpool               GearsWorkerPool
beta.blobbuilder               GearsBlobBuilder
beta.canvas                     GearsCanvas
beta.databasemanager   GearsDatabase2Manager
beta.dummymodule        GearsDummyModule
beta.console                     GearsConsole
beta.test                           GearsTest

构建JS模块
CreateModule(base_class.h)

4.4 比较重要的数据结构

JsCallContext(js_types.h),该对象封装了Javascript对象的函数调用上下文,本地代码通过该接口可以获取传入的参数个数,参数类型,以及返回对象或者设置异常。

ModuleEnvironment(base_class.h),该对象描述了模块创建的环境信息,包含安全信息(SecurityOrigin),JS上下文信息(JsContextPtr),权限管理信息(PermissionsManager),JS引擎信息等(JsRunnerInterface)

JSRunnerInterface(js_runner.h), 该对象是一个与平台无关的接口,其主要的作用是支持Javascript对象的创建,Javascript函数的访问,以及Javascript代码的运行。其实现代码位于js_runner_xx.cc。

PermissionManager(permission_manager.h),该对象实现了一个基于Security Origin Policy的安全管理机制

一下是对Javascript内建对象的C/C++封装(平台无关)
JsArray - 封装了Javascript规范中的Array对象
JsObject - 封装了Javascript规范中的Object对象
JsToken - Javascript标记,是所有Javascript内建对象的抽象,可以通过下列方法将对应的Javascript内建对象转换成标记
    BoolToJsToken
    IntToJsToken
    StringToJsToken
    DoubleToJsToken
    NullToJsToken
    UndefinedToJsToken
    以下是几个功能函数,判断该Token是否是对应类型
    JsTokenIsCallback
    JsTokenIsArray
    JsTokenIsObject
    JsTokenIsNullOrUndefined

4.5 资源本地化(GearsLocalServer)
GearsLocalServer描述了WebCacheDB中定义的数据集合,并且可以将这个集合作为一个组进行管理。LocalServer使用Domain,Name,Required_Cookie以及Server_Type几个值来标识一个唯一的属性。WebCache系统支持两种类型的本地化服务:资源存储(ResourceStores)和托管资源存储(ManagedResourceStores)
GearsResourceStore资源存储(实现类ResourceStore)
该对象提供了资源捕获接口,实际的捕获操作由CaptureTask完成
GearsManagedResource 托管资源存储(实现类ManagedResourceStore)
该对象提供了checkForUpdate方法,用户通过显示的调用该方法,可以完成已托管资源和服务器资源的同步。函数通过创建UpdateTask对象完成实际的资源同步操作。

4.6 用户数据缓存(DataBase)
Gears插件中使用SQLite作为数据存储引擎,其操作接口由GearsDatabase提供。

4.7 工作池(WorkerPool)

工作池概念的引入,使得同时可以运行多个JS脚本。这个过程实际上是通过一个线程池完成的,每次有创建一个工作者请求时,WorkerPool对象会从线程池中创建一个新线程,由该线程负责JS脚本的解析和执行。线程池的管理由PoolThreadsManager对象处理。