2025-04-23

 

## 概述

相信讀者已經註意到瞭,在最新的Android 4.4 Kitkat版本中,原本基於Android WebKit的WebView實現被換成基於Chromium的WebView實現。在前面的章節中,筆者也介紹過基於Chromium的WebView實現即將成為Android系統上的缺省實現方式,筆者也一直期待這一重大轉變,現在它真的發生瞭。而之前基於WebView接口的應用程序甚至可以直接工作在該實現上而不需要任何特別的改變。舉個例子來說,Android系統上的缺省瀏覽器(AOSP中的瀏覽器),可以不需要任何改變直接工作在新的實現上。

WebView是一種嵌入式的編程接口,能夠提供Java接口給開發者來使用該模塊來渲染網頁。現在的WebView隻是一個接口類,通過一些內部設計的改變,其具體的實現可以在之前的Android WebKit和Chromium之間進行切換。新的Chromium實現專註於提供一致性的接口(為瞭兼容以前的應用),而內部的渲染引擎改為使用基於Blink/Content內核的引擎,這實現不管是從功能上還是性能來講,都帶來巨大的提升。為瞭支持WebView的工作方式,Chromium還是做瞭不少的改變的,例如前面提到的進程模型,渲染方式等,下面一一對他們作介紹。

 

## Chromium WebView

在Android 4.4中,基於Chromium項目的WebView千呼萬喚始出來。為瞭支持歷史遺留的接口,Chromium還是做瞭很大改變的,讓筆者結合下圖的層次結構來解釋基本的過程。

/

上圖主要有四個部分,其中跟WebView相關的主要是上面三個部分,首先是WebView接口部分,它提供對外編程接口,同時它的內部實現可以基於橋接代碼,也就是第二個部分。橋接部分的代碼主要有兩個作用,其一是實現WebView接口對實現的調用,第二是調用下面一層的代碼,這裡面有個重要的部分就是需要設置AwContents為瞭繪圖而需要設置的兩組函數數組,這個在渲染部分介紹。它的代碼可以在frameworks/webview/chromium部分找到。以上兩個部分都是AOSP部分代碼,而第三個部分是AwContents是在Chromium項目中的,主要是構建被橋接代碼使用的接口,這一部分主要基於Content接口,裡面有很多不同於Chrome瀏覽器的實現。Android的開源代碼為瞭編譯上的方面,直接將Chromium 版本30代碼包含到external/chromium_org目錄中,有興趣的讀者可以自行查看。

 

## 同Chrome瀏覽器的比較

同Chrome瀏覽器比較,Chromium WebView在很多部分非常不一樣,例如開源與否、HTML5功能、版本支持、進程模型、渲染方式等。下表分析瞭這二者的主要區別。

 

 

Chromium WebView

Chrome瀏覽器(Android版)

是否開源

全部開源,包括內核,橋接層等

Java層部分的代碼,包括用戶界面的代碼是閉源的,也就是說開發者是沒有辦法基於Chrome瀏覽器定制新瀏覽器,隻可以基於Content層

HTML5功能

目前不支持WebGL,WebRTC,WebAudio等

隻是絕大多數HTML5功能,包括WebGL,WebRTC,WebAudio等

版本

僅能工作在Android4.4上,而且依賴於系統內部的函數,隻能同Android AOSP一起編譯,目前是Chromium 30的版本

能工作在>=Android 4.0,而且不需要依賴Android系統內部的函數。Chromium方面是跟隨最新的代碼。

進程模型

僅單進程

支持多進程和單進程(不過,目前單進程工作還有些問題)

渲染方式

支持軟件渲染和硬件加速渲染方式

目前隻是硬件加速渲染方式

 

## 渲染方式

至於WebView內部所使用的Chromium實現是采用硬件加速渲染還是軟件渲染,這裡還是比較復雜的。根據Android的View結構,WebView的內容需要通過一個onDraw(Canvas c)來完成繪制。為瞭將Chromium渲染網頁的結果繪制到該Canvas中,需要兩組繪圖函數組,第一組用來軟件渲染,第二組用來硬件加速渲染。而這兩組函數需要使用Android內部函數,這決定瞭目前WebView隻能同Android AOSP代碼一起編譯,而不能想應用程序一樣,隻是依賴於Android SDK/NDK來編譯。下圖是當用戶界面或者網頁需要繪制的時候,繪圖的基本過程。

/

這裡Chromium的合成器具有兩種能力,就是包含支持軟件渲染的軟件渲染器和硬件加速渲染的渲染器。當用戶界面所對應的畫佈(canvas)是硬件加速的話,那麼內部采用硬件渲染機制。如果不是硬件加速的話,那麼采用軟件渲染機制。當用戶的界面設置為硬件加速的時候(開發者可以在應用程序的AndroidManifest.xml中設置屬性android:hardwareAccelerated=true),那麼用戶界面對應的畫佈即為硬件加速,否則即為軟件渲染方式。所以,具體Chromium WebView采用什麼樣的方式,取決於調用WebView的應用程序的設置方式。

值得提出的是,這裡的硬件加速機制同Chrome瀏覽器的硬件加速機制是不一致的,因為Chrome瀏覽器為渲染網頁使用的控件是Android的SurfaceView,根據Android系統的說明,SurfaceView是可以在不同的線程來繪制的,因為Chrome瀏覽器是首先獲取SurfaceView的Surface對象的句柄(ID),然後由Chrome瀏覽器的GPU線程來繪制網頁。這樣,網頁的渲染同主線程完全隔離開來瞭,不會因為網頁的渲染而阻礙用戶界面的響應。

而在Chromium WebView的實現中,因為WebView不是基於SurfaceView類的(因為歷史遺留問題),所以,繪制內容到畫佈上必須在主線程來操作,由此,這些渲染工作隻能在主線程上工作,可能在某種程度上阻礙用戶界面的響應。

因為WebView采用單進程的渲染方式,因為可以節省一些內存使用空間,有興趣的讀者可以進行一些分析。

 

## 參考資料

1. https://developers.google.com/chrome/mobile/docs/webview/overview

2. https://android.googlesource.com/platform/external/chromium_org/

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *