Gears框架分析

轉貼請註明出處

 

一、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對象處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章