標籤:chromium android 瀏覽器 核心 載入
本文只描述Http網路請求相關的資訊,Https、Spdy、file、ftp、websocket等的類型只提及在哪裡出現關係分支。
代碼層次圖如下:
+----------------------------------------+| 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 |+--------------------------------------------+
下面是詳細的類間關係/層次圖。看圖提示:
- package開頭的層是java類
- 不同層次有同名的類則都標出命名空間,如ResourceLoader、FrameTree
- 如果一個純虛類只有單個實現,則縮寫成 基類名|Impl
- 是從使用者的角度按資料流向來分層次高低,並按功能集聚來劃分模組(這是個人理解,非官方文檔說明)
- 如果A類跟B類的基類發生聯絡,則實際是由B類和A類互動。
- 橫線表示區分功能模組/包/命名空間。黃色矩形標籤表示此層的功能/意義。灰色矩形是對這層的說明。
- 第一遍,只看黃色標籤,知道有哪些層次和層次間關係;第二遍,看你關心的層,包含該層的說明以及和上下層的銜接。如果有興趣,第三遍認真看完,搞清楚全貌。
簡化的訊息流程如下:
- 在Browser進程的UI線程開始WebView.loadUrl
- 經過多層橋接,到達ContentViewCore.java這個類轉入JNI代碼content::ContentViewCoreImpl
- 由NavigationControllerImpl封裝好URL發起C++形式的請求,並由RenderFrameHostImpl將它轉化為IPC訊息發去Renderer進程
- Renderer進程中經過IPC機制處理後,到達RenderFrameImpl,然後訊息流過blink和WebCore層,最後到達WebURLLoaderImpl負責實際載入
- WebURLLoaderImpl通過IPCResourceLoaderBridge發送IPC訊息給Browser進程的I/O線程進行網路資料I/O
- 這個訊息經IPC機制處理後由ResourceDispatcherHostImpl接收,然後交給content::ResourceLoader來控制net庫進行網路通訊擷取資料
- net庫經過HttpCache(Memory | Disk)、DNS(HostCache)、connect(SSL握手)、write、read後,得到的資料最後通過ResourceMessageFilter發出IPC訊息回去Renderer進程
- WebCore擷取到資料後,通過P ostTask交由解析線程處理
下面是載入流程的xmind匯出圖,最好另存新檔到本地用看圖軟體看。看圖提示:
- 從上往下是根據堆棧倒置過來畫的流程
- “..."表示省略IPC機制的代碼
- 圖中有一些地方省略了Callback機制的代碼
- 同一父節點表示在此父函數內按順序執行
- 大部分類名和函數名已代表了其功能和意義,還可查看該類的標頭檔注釋來協助理解,或對照下面的”類間關係圖“。有些類在做具體開發時才有必要瞭解,所以不加解釋。
- 流程中有幾個類都有同名函數doLoop,這些類都是把大流程分割成細小的操作,內部用表示操作步驟的emun狀態(圖中的case XXX分支)來跟蹤進行到哪一步,如此來實現非同步並減小當次loop的處理時間。
圖太大,分成兩段,點擊查看大圖:
轉載請註明出處:http://blog.csdn.net/hursing