ChromiumonAndroid:認(rèn)識(shí)ChromiumWebView

Android KitKat一項(xiàng)重要的更新就是WebView采用Chromium/Blink渲染引擎,本文簡(jiǎn)要的敘述了新版WebView的主要特性、需要進(jìn)一步改進(jìn)的地方以及WebView的代碼結(jié)構(gòu)等。

創(chuàng)新互聯(lián)建站專業(yè)為企業(yè)提供嵐皋網(wǎng)站建設(shè)、嵐皋做網(wǎng)站、嵐皋網(wǎng)站設(shè)計(jì)、嵐皋網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、嵐皋企業(yè)網(wǎng)站模板建站服務(wù),10余年嵐皋做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

WebView前世今生

WebView是Android平臺(tái)上一個(gè)非常重要的系統(tǒng)組件,用于將一個(gè)顯示W(wǎng)eb頁(yè)面的窗口部件view嵌入到應(yīng)用程序,并提供了一組API接口允許開(kāi)發(fā)者定制頁(yè)面加載和繪制的行為,比如響應(yīng)頁(yè)面加載狀態(tài)的變化和彈出JavaScript對(duì)話框的請(qǐng)求等等。自Android 1.0發(fā)布以來(lái),WebView被廣泛地使用在應(yīng)用程序中,最典型的當(dāng)屬Stock瀏覽器了,它就是基于WebView開(kāi)發(fā)的一個(gè)瀏覽器程序。關(guān)于詳盡的文檔描述,請(qǐng)參看WebView的官方文檔。 

早期的WebView (在Android 4.4以前)是基于WebKit實(shí)現(xiàn)的,可以簡(jiǎn)單理解為直接在WebKit代碼庫(kù)中增加一個(gè)分支,解決Android平臺(tái)特定的頁(yè)面渲染方式以及通過(guò)JNI接口將WebKit的功能橋接為Java層的API接口。在圖形方面,WebView和Android平臺(tái)一樣,采用的是Skia圖形庫(kù),但沒(méi)有啟用硬件加速,渲染性能非常不好,這也是許多使用者經(jīng)常抱怨的詬病之一。 

隨著Android 4.4 (KitKat) 平臺(tái)的發(fā)布,基于Chromium開(kāi)源項(xiàng)目的WebView成為KitKat平臺(tái)的一大亮點(diǎn)。新版WebView采用了與Chrome瀏覽器相同的Blink渲染引擎,v8 JavaScript引擎,網(wǎng)絡(luò)庫(kù)以及內(nèi)存分配器,在HTML5特性支持方面不僅與Chrome保持了更高的一致性,而且還彌補(bǔ)了舊版WebView在渲染性能方面的不足。Android平臺(tái)上所有使用WebView的應(yīng)用程序都將無(wú)縫透明地受益于新版WebView的特性支持和性能提升。

目前,Android KitKat上的WebView是基于Chromium 30.0.0.0,而Chromium開(kāi)源項(xiàng)目一直以6周一次的迭代周期在快速演進(jìn),Google官方并沒(méi)有給出一個(gè)明確的計(jì)劃什么時(shí)候以什么方式升級(jí)WebView組件,也許是通過(guò)GMS,但盡管如此,就目前的情形來(lái)看,新版WebView只能在Android 4.4系統(tǒng)上使用。這就意味著目前市面大量Android 4.3或以前的設(shè)備都不能使用新版的WebView,享用不到新版WebView引入的好處。為什么其他非4.4的設(shè)備上不能使用呢?原因主要是Chromium WebView必須與AOSP (Android Open Source Project) 源代碼一起才能編譯,不能單獨(dú)從Chromium的代碼庫(kù)中編譯一個(gè)可以獨(dú)立安裝的軟件包。

主要特性

  • 支持更多的HTML5特性,例如Web Socket, Web Worker, FileSystem API, Page Visibility API, CSSfilter等等。html5test.com跑分結(jié)果為448分,與Chrome瀏覽器非常接近了。

  • 添加了對(duì)遠(yuǎn)程調(diào)試功能的支持。任何使用WebView的應(yīng)用程序默認(rèn)都開(kāi)啟了遠(yuǎn)程調(diào)試功能,通過(guò)USB線連接到開(kāi)發(fā)主機(jī)上,在主機(jī)的Chrome瀏覽器中輸入chrome://inspect就可以直接在開(kāi)發(fā)主機(jī)上直接調(diào)試WebView加載的頁(yè)面。開(kāi)發(fā)者也可以調(diào)用 setWebContentsDebuggingEnabled開(kāi)啟或關(guān)閉這個(gè)功能。這對(duì)廣大HTML5應(yīng)用開(kāi)發(fā)者絕對(duì)是一個(gè)福音。

  • 更智能的內(nèi)存管理策略。舊版WebView需要應(yīng)用程序在系統(tǒng)內(nèi)存不足的情況下,顯式地調(diào)用freeMemory方法來(lái)釋放WebView占用的內(nèi)存資源,。而新版的 WebView中,freeMemory這個(gè)方法已經(jīng)被標(biāo)記為“deprecated”,也就是應(yīng)用程序不需要自己去釋放內(nèi)存,WebView的內(nèi)部實(shí)現(xiàn)已經(jīng)考慮了對(duì)系統(tǒng)低內(nèi)存運(yùn)行時(shí)的響應(yīng),一旦發(fā)現(xiàn)系統(tǒng)處于低內(nèi)存的運(yùn)行狀態(tài),WebView會(huì)主動(dòng)調(diào)整內(nèi)存分配策略,盡可能釋放一些已占用的內(nèi)存資源。

  • 支持軟件渲染和硬件加速模式。Android應(yīng)用程序可以在manifest文件中指定hardwareAccelerated的值表明是否啟動(dòng)硬件加速,為了兼容早期使用WebView的應(yīng)用程序,新版WebView同時(shí)支持軟件渲染和硬件渲染兩種模式。

不足之處

  • 尚有一些重量級(jí)的HTML5特性沒(méi)有支持,比如WebGL,WebRTC,其中原因是WebGL對(duì)圖形顯卡的要求很高,而目前市面上每個(gè)廠商的硬件能力不盡相同,所有激進(jìn)地開(kāi)啟WebGL的支持可能會(huì)導(dǎo)致平臺(tái)的一致性問(wèn)題,即同一個(gè)HTML5應(yīng)用在不同的設(shè)備上行不一致,有的能跑,有的掛掉。

  • 尚有一些輕量級(jí)但實(shí)用的HTML5 API還不支持。典型的有兩個(gè),一個(gè)是全屏Fullscreen API,另外一個(gè)是Network Information API.

  • Canvas 2D沒(méi)有開(kāi)啟硬件加速模式。Canvas2D的性能和Chrome瀏覽器還是有一定差距,從代碼注釋來(lái)看,是因?yàn)閟kia庫(kù)中硬件加速的Canvas 2D后端Ganesh可能會(huì)導(dǎo)致WebView崩潰。

  • 硬件加速渲染模式下所有對(duì)GPU的操作都發(fā)生在主線程中。UI主線程實(shí)在是太忙,如果能和Chrome一樣,專門為GPU操作創(chuàng)建一個(gè)線程,性能還可得到進(jìn)一步提升。

更新:最新的Chromium WebView,已經(jīng)添加了WebGL,WebRTC以及加速Canvas 2D的支持了。

代碼結(jié)構(gòu)

確切地說(shuō),在AOSP中WebView是由三部分代碼組成:

Chromium on Android: 認(rèn)識(shí)Chromium WebView

  • Chromium代碼:包含在external/chromium_org目錄中,其中android_webview/目錄包含了WebView的內(nèi)部實(shí)現(xiàn)代碼和對(duì)應(yīng)的Java類包;

  • Java橋接代碼:包含在framework/webview/java目錄中,提供了基于Chromium的WebViewProvider實(shí)現(xiàn)類WebViewChromium,這個(gè)類將被Android系統(tǒng)動(dòng)態(tài)加載后作為android.webkit.WebView的內(nèi)部實(shí)現(xiàn);

  • Android平臺(tái)支持代碼:這部分代碼量少但至關(guān)重要。在硬件加速模式下,WebView必須能夠直接訪問(wèn)Android系統(tǒng)的顯存以及對(duì)HardwareCanvas執(zhí)行GL操作,而訪問(wèn)顯存和對(duì)HardwareCanvas的操作沒(méi)有相應(yīng)的SDK或NDK的支持,只能直接調(diào)用AOSP代碼。這也是前面提到的WebView必須和AOSP一起編譯的原因。

從AOSP中編譯WebView

如果編譯一個(gè)完整版的WebView,需要先要下載整個(gè)AOSP的代碼,運(yùn)行source build/envsetup.sh和lunch <target>命令后,進(jìn)入framework/webview目錄執(zhí)行mm –j8編譯WebView模塊,最后在out目前將會(huì)得到libchromiumwebview.so和libwebkit_plat_support.so兩個(gè)動(dòng)態(tài)鏈接庫(kù),將這兩個(gè)so文件拷貝到目標(biāo)設(shè)備的/system/lib目錄下,重啟設(shè)備后就可以使用你自己編譯的WebView了。

 從Chromium中編譯WebView

實(shí)際上,也從直接從Chromium代碼庫(kù)中編譯WebView,但這個(gè)WebView并不是一個(gè)完整的WebView。前面說(shuō)到,WebView還包括了Android平臺(tái)支撐代碼,而Chromium代碼庫(kù)并沒(méi)有包含這部分代碼,所以編譯出來(lái)的WebView只有純軟件的渲染模式。因此,它對(duì)幫助驗(yàn)證一個(gè)WebView功能性方面的問(wèn)題還有有用的,對(duì)于優(yōu)化渲染性能只能從AOSP編譯了。

根據(jù)chromium.org官方文檔,下載chromium代碼庫(kù),配置好環(huán)境后運(yùn)行:

$ . build/android/envsetup.sh
$ android_gyp
$ ninja –C out/Release android_webview_apk

編譯成功后,在out/Release/apks目錄中會(huì)有一個(gè)名為AndroidWebView.apk的文件生成,它是一個(gè)Shell程序,提供了一個(gè)簡(jiǎn)單的UI,方便開(kāi)發(fā)者驗(yàn)證WebView的核心功能,但AndroieWebView.apk并沒(méi)有直接使用android.webkit.WebView,而是基于WebView的核心類AwContents實(shí)現(xiàn)的,查看manifest文件你會(huì)發(fā)現(xiàn)它將android:hardwareAccelerated設(shè)置為false了,也就是說(shuō)應(yīng)用程序沒(méi)有開(kāi)啟硬件加速,相應(yīng)地WebView也只是工作在軟件渲染模式下。如果強(qiáng)制把a(bǔ)ndroid:hardwareAccelerated設(shè)置為true,這個(gè)Shell程序則不能正常顯示網(wǎng)頁(yè)了,這是意料之中的,硬件加速渲染模式必須要與AOSP一起編譯才會(huì)有。

參考資源

[1] WebView SDK,http://developer.android.com/reference/android/webkit/WebView.html

[2] Web程序的遷移,http://developer.android.com/guide/webapps/migrating.html

[3] WebView for Android, https://developers.google.com/chrome/mobile/docs/webview

[4] 遠(yuǎn)程調(diào)試 for Android, https://developers.google.com/chrome-developer-tools/docs/remote-debugging

[5] Android上編譯Chromium, https://code.google.com/p/chromium/wiki/AndroidBuildInstructions

文章標(biāo)題:ChromiumonAndroid:認(rèn)識(shí)ChromiumWebView
網(wǎng)站地址:http://muchs.cn/article30/joposo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、企業(yè)網(wǎng)站制作網(wǎng)站設(shè)計(jì)、外貿(mào)建站網(wǎng)站制作、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司