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

來源:互聯網
上載者:User

標籤: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                   |+--------------------------------------------+ 

 

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

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


簡化的訊息流程如下:

  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擷取到資料後,通過P ostTask交由解析線程處理

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

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

圖太大,分成兩段,點擊查看大圖:



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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.