1. 程式人生 > >Android4.4系統瀏覽器Chromium實現的載入模組與流程

Android4.4系統瀏覽器Chromium實現的載入模組與流程



本文只描述Http網路請求相關的資訊,Https、Spdy、file、ftp、websocket等的型別只提及在哪裡出現關係分支。

PS:一部分實現是在content層的,所以這裡其實並不全,例如沒提到URLRequestContext、CookieStore。

程式碼層次圖如下:

+----------------------------------------+
|     WebView.java (SDK public API)      |
+----------------------------------------+
|      Android & Chromium Wrapper        | Java橋接和封裝層
+----------------------------------------+
|   Content Module (Navigation Control)  | 核心層,載入流程中負責各種跳轉
+----------------------------------------+
|     blink public web API (WebView)     | web api供外部操控核心
+----------------------------------------+
|                WebCore                 | 原有WebCore的頭尾被砍掉抽離形成blink
+----------------------------------------+
|  blink public platform API  (Network)  | platform api要求外部實現
+----------------------------------------+
|      Content Module (I/O thread)       | 對上層的實現,在IO執行緒中操作
+----------------------------------------+
|            Network Stack               | 網路庫
+----------------------------------------+

下面是功能模組層次圖(詳細圖中的黃色標籤的索引):

+--------------------------------------------+
|            Browser Application             | 瀏覽器程式
+--------------------------------------------+
|          package android.webkit            | SDK API
+--------------------------------------------+
|    package com.android.webview.chromium    | Android橋接層
+--------------------------------------------+
|    package org.chromium.android_webview    | Chromium封裝層
+--------------------------------------------+
|    package org.chromium.content.browser    | Chromium Android平臺程式碼
+--------------------------------------------+
|        content Module Browser Side         | Content模組Browser端的處理
+--------------------IPC
---------------------+ |   content Module Renderer Side      | Content模組Renderer端的處理 +--------------------------------------------+ | blink public Web API | +--------------------------------------------+ | WebCore | +--------------------------------------------+ | blink public Platform API | +--------------------------------------------+ | content Module implementation of blink | content實現blink的介面 +--------------------IPC
-------------------- + | content Module Loading Control | 載入流程控制 +--------------------------------------------+ | net Module public API | net庫的對外介面層 +--------------------------------------------+ |  Job Factory | 任務工廠(區分網路協議) +--------------------------------------------+ | Transaction & HttpCache | 事務與HttpCache +--------------------------------------------+ | | Session & Socket Pool | 會話與Socket Pool | stream |---------------------------| 流 |  | DNS & HostCache | +--------------------------------------------+ | socket | +--------------------------------------------+ 

簡化的訊息流如下:

  1. Browser程序的UI執行緒開始WebView.loadUrl
  2. 經過多層橋接,到達ContentViewCore.java這個類轉入JNI程式碼content::ContentViewCoreImpl
  3. 由NavigationControllerImpl包裝好URL發起C++形式的請求,並由RenderFrameHostImpl將它轉化為IPC訊息發去Renderer程序
  4. Renderer程序中經過IPC機制處理後,到達RenderFrameImpl,然後訊息流過blink和WebCore層,最後到達WebURLLoaderImpl負責實際載入
  5. WebURLLoaderImpl通過IPCResourceLoaderBridge傳送IPC訊息給Browser程序的I/O執行緒進行網路資料I/O
  6. 這個訊息經IPC機制處理後由ResourceDispatcherHostImpl接收,然後交給content::ResourceLoader來控制net庫進行網路通訊獲取資料
  7. net庫經過HttpCache(Memory | Disk)、DNS(HostCache)、connect(SSL握手)、write、read後,得到的資料最後通過ResourceMessageFilter發出IPC訊息回去Renderer程序
  8. WebCore獲取到資料後,通過PostTask交由解析執行緒處理

下面是詳細的類間關係/層次圖。看圖提示:

  1. package開頭的層是java類
  2. 不同層次有同名的類則都標出名稱空間,如ResourceLoader、FrameTree
  3. 如果一個純虛類只有單個實現,則縮寫成 基類名|Impl
  4. 是從使用者的角度按資料流向來分層次高低,並按功能集聚來劃分模組(這是個人理解,非官方文件說明)
  5. 如果A類跟B類的基類發生聯絡,則實際是由B類和A類互動。 
  6. 橫線表示區分功能模組/包/名稱空間。黃色矩形標籤表示此層的功能/意義。灰色矩形是對這層的說明。
  7. 第一遍,只看黃色標籤,知道有哪些層次和層次間關係;第二遍,看你關心的層,包含該層的說明以及和上下層的銜接。如果有興趣,第三遍認真看完,搞清楚全貌。


下面是載入流程的xmind匯出圖,最好另存為到本地用看圖軟體看。看圖提示:

  1. 從上往下是根據堆疊倒置過來畫的流程
  2. “..."表示省略IPC機制的程式碼
  3. 圖中有一些地方省略了Callback機制的程式碼
  4. 同一父節點表示在此父函式內按順序執行
  5. 大部分類名和函式名已代表了其功能和意義,還可檢視該類的標頭檔案註釋來幫助理解,或對照下面的”類間關係圖“。有些類在做具體開發時才有必要了解,所以不加解釋。
  6. 流程中有幾個類都有同名函式doLoop,這些類都是把大流程分割成細小的操作,內部用表示操作步驟的emun狀態(圖中的case XXX分支)來跟蹤進行到哪一步,如此來實現非同步並減小當次loop的處理時間。

圖太大,分成兩段,點選檢視大圖:(可能不全以及有誤,可用作理解,勿用作設計參考


轉載請註明出處:http://blog.csdn.net/hursing