所在位置:首頁(yè) > 手機(jī)應(yīng)用 > Android System WebView
Android System WebView

Android System WebView

類型: 系統(tǒng)工具 時(shí)間:2024-10-30 13:36:01

評(píng)分: 9.0 標(biāo)簽: 導(dǎo)航 瀏覽器

掃描二維碼下載

應(yīng)用 介紹

AndroidSystemWebView為安卓用戶提供了非常優(yōu)質(zhì)的谷歌插件服務(wù),內(nèi)置的功能比較全面,支持存儲(chǔ)不同的瀏覽器信息,還能將音樂(lè)或者是各種書(shū)簽存儲(chǔ)在本地,使用網(wǎng)絡(luò)的時(shí)候也可以提前優(yōu)化整個(gè)網(wǎng)絡(luò)的運(yùn)行,無(wú)論在家在哪一種資源的時(shí)候,都可以變得更加,還能保留每一次的瀏覽信息。

Android System WebView是什么?

webview是一個(gè)可視化的組件,是作為原生APP的視覺(jué)部分??梢詢?nèi)嵌在移動(dòng)端,實(shí)現(xiàn)前端的混合式開(kāi)發(fā),大多數(shù)混合式開(kāi)發(fā)框架都是基于WebView模式進(jìn)行二次開(kāi)發(fā)的。比如:APIcloud、uni-app等等的框架。

一、webview入門(mén)知識(shí)

1、我們通常是用瀏覽器來(lái)瀏覽網(wǎng)頁(yè),你很清楚的知道你正在使用瀏覽器,要么是PC客戶端,要么是手機(jī)上的app。但是webview是一個(gè)嵌入式的瀏覽器,是嵌入在原生應(yīng)用中的,你可能都意識(shí)不到你在用瀏覽器。

2、傳統(tǒng)瀏覽器分為兩個(gè)部分,UI(地址欄、導(dǎo)航欄)和瀏覽器引擎。webview就是原生應(yīng)用中的瀏覽器引擎。

3、webview只是一個(gè)可視化的組件,是作為原生APP的視覺(jué)部分。

4、用webview展示的內(nèi)容是不需要存儲(chǔ)在本地的,可以直接從服務(wù)器獲取。

5、這種靈活性打開(kāi)了瀏覽器端的web應(yīng)用和希望展示在原生應(yīng)用中的web應(yīng)用代碼直接可重用的世界。

6、運(yùn)行在webview中的JS代碼有能力調(diào)用原生的系統(tǒng)API,沒(méi)有傳統(tǒng)瀏覽器沙箱的限制。

7、沙箱的存在是因?yàn)?,你永遠(yuǎn)不能完全信任加載的web內(nèi)容,所以不能允許它調(diào)用原生的系統(tǒng)API。而在webview中開(kāi)發(fā)人員通??梢酝耆刂萍虞d的內(nèi)容,惡意代碼進(jìn)入并在設(shè)備上造成混亂的可能性很低。

8、在webview中,JS代碼可以跟原生應(yīng)用代碼相互通信,也可以調(diào)用原生API集成酷炫的系統(tǒng)級(jí)功能,如傳感器、存儲(chǔ)、日歷、聯(lián)系人等。

二、webview的用法

1、作為APP內(nèi)置瀏覽器,顯示鏈接的內(nèi)容。

2、用來(lái)顯示廣告。

3、完全承載APP內(nèi)的所有交互。從技術(shù)角度看這些仍是原生應(yīng)用,但它做的唯一原生操作就是托管webview,這種應(yīng)用被稱為混合應(yīng)用。從部署和更新的角度來(lái)看,混合應(yīng)用非常方便。

4、作為原生應(yīng)用的擴(kuò)展。許多原生應(yīng)用會(huì)提供加載項(xiàng)或擴(kuò)展程序來(lái)擴(kuò)展其功能,由于web技術(shù)的簡(jiǎn)單性和強(qiáng)大,這些加載項(xiàng)和擴(kuò)展通常以HTML、CSS、JS而不是C++、C#或其他來(lái)構(gòu)建。

三、webview的精髓

webview其實(shí)只是一個(gè)再應(yīng)用中設(shè)置好位置和大小的瀏覽器,而且不會(huì)放置任何花哨的UI。

在大多數(shù)情況下,除非你調(diào)用了原生API,否則不必在webview中專門(mén)測(cè)試web應(yīng)用。

Android System WebView具體實(shí)現(xiàn)與Chromium渲染引擎啟動(dòng)流程

這里以Android 8.0的源碼為來(lái)說(shuō)明,是先找到WebView的真正的構(gòu)造函數(shù):

這個(gè)構(gòu)造函數(shù)會(huì)調(diào)用另外一個(gè)成員函數(shù)ensureProviderCreated()確保Chromium動(dòng)態(tài)庫(kù)已經(jīng)加載。在Chromium動(dòng)態(tài)庫(kù)已經(jīng)加載的情況下,WebView類的成員函數(shù)ensureProviderCreated還會(huì)創(chuàng)建一個(gè)WebViewProvider對(duì)象,并且保存在成員變量mProvider中。這個(gè)WebViewProvider其實(shí)才是真正用來(lái)實(shí)現(xiàn)WebView的功能的幕后大佬。上訴那些Android WebView主要的方式基本都是通過(guò)mProvider來(lái)實(shí)現(xiàn)的,例如loadUrl(String url)等方法。

有了這個(gè)mProvider之后,WebView類的構(gòu)造函數(shù)就會(huì)繼續(xù)調(diào)用mProvider.init(javaScriptInterfaces, privatepowsing)啟動(dòng)網(wǎng)頁(yè)渲染引擎。對(duì)于基于Chromium實(shí)現(xiàn)的WebView來(lái)說(shuō),它使用的WebViewProvider是一個(gè)WebViewChromium對(duì)象。當(dāng)這個(gè)WebViewChromium對(duì)象的成員函數(shù)init被調(diào)用的時(shí)候,它就會(huì)啟動(dòng)Chromium的網(wǎng)頁(yè)渲染引擎。

所以,我們接下來(lái)看一下ensureProviderCreated的實(shí)現(xiàn):

WebView類的成員函數(shù)ensureProviderCreated首先調(diào)用成員函數(shù)checkThread確保它是在WebView的創(chuàng)建線程中調(diào)用的,接下來(lái)又會(huì)判斷成員變量mProvider的值是否為null。如果為null,就表示它還沒(méi)有當(dāng)前創(chuàng)建的WebView創(chuàng)建過(guò)Provider。在這種情況下,它首先會(huì)調(diào)用成員函數(shù)getFactory獲得一個(gè)WebViewFactory。有了這個(gè)WebViewFactory之后,就可以調(diào)用它的成員函數(shù)createWebView創(chuàng)建一個(gè)WebViewProvider。

接下來(lái)我們?cè)倏匆幌耮etFactory()方法以及它的實(shí)現(xiàn):

getFactory返回的WebView Factory是通過(guò)調(diào)用WebViewFactory類的靜態(tài)成員函數(shù)getProvider獲得的,getProvider首先是判斷靜態(tài)成員變量sProviderInstance的值是否等于null。如果等于null,那么就說(shuō)明當(dāng)前的App進(jìn)程還沒(méi)有加載過(guò)Chromium動(dòng)態(tài)庫(kù)。在這種情況下,就需要加載Chromium動(dòng)態(tài)庫(kù),并且創(chuàng)建一個(gè)WebView Factory,保存在靜態(tài)成員變量sProviderInstance。接下來(lái)我們就先分析Chromium動(dòng)態(tài)庫(kù)的加載過(guò)程,然后再分析WebView Factory的創(chuàng)建過(guò)程。

加載Chromium動(dòng)態(tài)庫(kù)是通過(guò)調(diào)用WebViewFactory類的靜態(tài)成員函數(shù)loadNativeLipary實(shí)現(xiàn)的:

loadNativeLipary首先會(huì)調(diào)用成員函數(shù)getWebViewNativeLiparyPaths獲得要加載的Chromium動(dòng)態(tài)庫(kù)的文件路徑,然后再調(diào)用另外一個(gè)靜態(tài)成員函數(shù)nativeLoadWithRelroFile對(duì)它進(jìn)行加載。在加載的時(shí)候,會(huì)指定一個(gè)Chromium GNURELRO Section文件。這個(gè)Chromium GNURELRO Section文件是系統(tǒng)啟動(dòng)時(shí)候,通過(guò)啟動(dòng)一個(gè)臨時(shí)進(jìn)程生成的。其中靜態(tài)成員函數(shù)nativeLoadWithRelroFile是一個(gè)JNI方法,它由C++層的函數(shù)LoadWithRelroFile實(shí)現(xiàn):

LoadWithRelroFile判斷自己是32位還是64位的實(shí)現(xiàn),然后從參數(shù)lib32和lib64中選擇對(duì)應(yīng)的Chromium動(dòng)態(tài)庫(kù)進(jìn)行加載。

這個(gè)加載過(guò)程是通過(guò)調(diào)用另外一個(gè)函數(shù)DoLoadWithRelroFile實(shí)現(xiàn)的:

函數(shù)DoLoadWithRelroFile的實(shí)現(xiàn)是通過(guò)Linker導(dǎo)出的函數(shù)androiddlopenext在Zyogote進(jìn)程保留的地址空間中加載Chromium動(dòng)態(tài)庫(kù)的。注意,App進(jìn)程是Zygote進(jìn)程fork出來(lái)的,因此它同樣會(huì)獲得Zygote進(jìn)程預(yù)留的地址空間。不過(guò),函數(shù)DoLoadWithRelroFile會(huì)將告訴函數(shù)androiddlopenext在加載Chromium動(dòng)態(tài)庫(kù)的時(shí)候,將參數(shù)relro描述的Chromium GNURELRO Section文件內(nèi)存映射到內(nèi)存來(lái),并且代替掉已經(jīng)加載的Chromium動(dòng)態(tài)庫(kù)的GNURELRO Section。這是通過(guò)將指定一個(gè)ANDROIDDLEXTUSERELRO標(biāo)志實(shí)現(xiàn)的。之所以可以這樣做,是因?yàn)閰?shù)relro描述的Chromium GNURELRO Section文件對(duì)應(yīng)的Chromium動(dòng)態(tài)庫(kù)的加載地址與當(dāng)前App進(jìn)程加載的Chromium動(dòng)態(tài)庫(kù)的地址一致。只要兩個(gè)相同的動(dòng)態(tài)庫(kù)在兩個(gè)不同的進(jìn)程中的加載地址一致,它們的鏈接和重定位信息就是完全一致的,因此就可以通過(guò)文件內(nèi)存映射的方式進(jìn)行共享。共享之后,就可以達(dá)到節(jié)省內(nèi)存的目的了。

這一步執(zhí)行完成之后,App進(jìn)程就加載完成Chromium動(dòng)態(tài)庫(kù)了。回到前面分析的WebViewFactory類的靜態(tài)成員函數(shù)getProvider,它接下來(lái)繼續(xù)創(chuàng)建一個(gè)WebViewFactory。這個(gè)WebViewFactory以后就可以用來(lái)創(chuàng)建WebViewProvider。

WebViewFactory類的靜態(tài)成員函數(shù)getProvider首先要確定要?jiǎng)?chuàng)建的WebView Factory的類型。這個(gè)類型是通過(guò)調(diào)用另外一個(gè)靜態(tài)成員函數(shù)getFactoryClass獲得的:

從這里可以看到,WebViewFactory類的靜態(tài)成員函數(shù)getFactoryClass返回的WebView Factory的類型為com.android.webview.chromium.WebViewChromiumFactoryProviderForO。這個(gè)com.android.webview.chromium.WebViewChromiumFactoryProviderForO類是由前面提到的WebView Package提供的。這意味著WebViewFactory類的靜態(tài)成員函數(shù)getProvider創(chuàng)建的WebView Factory是一個(gè)WebViewChromiumFactoryProvider對(duì)象:

WebViewChromiumFactoryProvider類的構(gòu)造函數(shù)會(huì)調(diào)用AwpowserProcess類的靜態(tài)成員函數(shù)loadLipary對(duì)前面加載的Chromium動(dòng)態(tài)庫(kù)進(jìn)行初始化:

AwpowserProcess類的靜態(tài)成員函數(shù)loadLipary又調(diào)用LiparyLoader類的靜態(tài)成員函數(shù)loadNow對(duì)前面加載的Chromium動(dòng)態(tài)庫(kù)進(jìn)行初始化:

LiparyLoader類的靜態(tài)成員函數(shù)loadNow又調(diào)用另外一個(gè)重載版本的靜態(tài)成員函數(shù)loadNow對(duì)前面加載的Chromium動(dòng)態(tài)庫(kù)進(jìn)行初始化:

LiparyLoader類重載版本的靜態(tài)成員函數(shù)loadNow又調(diào)用另外一個(gè)靜態(tài)成員函數(shù)loadAlreadyLocked對(duì)前面加載的Chromium動(dòng)態(tài)庫(kù)進(jìn)行初始化:

由于并不是所有的系統(tǒng)都支持在加載動(dòng)態(tài)庫(kù)時(shí),以文件內(nèi)存映射的方式代替它的GNURELRO Section,因此Chromium自己提供了一個(gè)Linker。通過(guò)這個(gè)Linker加載動(dòng)態(tài)庫(kù)時(shí),能夠以文件內(nèi)存映射的方式代替要加載的動(dòng)態(tài)庫(kù)的GNURELRO Section,也就是實(shí)現(xiàn)前面提到的函數(shù)androiddlopenext的功能。在高于Android 5.0中,由于系統(tǒng)已經(jīng)提供了函數(shù)androiddlopenext,因此,Chromium就不會(huì)使用自己的Linker加載動(dòng)態(tài)庫(kù),而是使用Android系統(tǒng)提供的Linker來(lái)加載動(dòng)態(tài)庫(kù)。通過(guò)調(diào)用System類的靜態(tài)成員函數(shù)loadLipary即可以使用系統(tǒng)提供的Linker來(lái)加載動(dòng)態(tài)庫(kù)。LiparyLoader類的靜態(tài)成員函數(shù)loadAlreadyLocked要加載的動(dòng)態(tài)庫(kù)由NativeLiparies類的靜態(tài)成員變量LIpARIES指定:

從這里可以知道,LiparyLoader類的靜態(tài)成員函數(shù)loadAlreadyLocked要加載的動(dòng)態(tài)庫(kù)就是Chromium動(dòng)態(tài)庫(kù)。這個(gè)Chromium動(dòng)態(tài)庫(kù)前面已經(jīng)加載過(guò)了,因此這里通過(guò)調(diào)用System類的靜態(tài)成員函數(shù)loadLipary再加載時(shí),僅僅是只會(huì)觸發(fā)它導(dǎo)出的函數(shù)JNIOnLoad被調(diào)用,而不會(huì)重新被加載。Chromium動(dòng)態(tài)庫(kù)導(dǎo)出的JNIOnLoad被調(diào)用的時(shí)候,Chromium動(dòng)態(tài)庫(kù)就會(huì)執(zhí)行初始化工作:

其中的一個(gè)初始化操作是給Chromium的Content層設(shè)置一個(gè)類型為AwMainDelegate的Main Delegate。這個(gè)AwMainDelegate實(shí)現(xiàn)在Chromium的androidwebview模塊中。Android WebView是通過(guò)Chromium的androidwebview模塊加載和渲染網(wǎng)頁(yè)的。Chromium加載和渲染網(wǎng)頁(yè)的功能又是實(shí)現(xiàn)在Content層的,因此,Chromium的androidwebview模塊又要通過(guò)Content層實(shí)現(xiàn)加載和渲染網(wǎng)頁(yè)功能。這樣,Chromium的androidwebview模塊就可以設(shè)置一個(gè)Main Delegate給Content層,以便它們可以互相通信。給Chromium的Content層設(shè)置一個(gè)Main Delegate是通過(guò)調(diào)用函數(shù)SetContentMainDelegate實(shí)現(xiàn)的:

從前面的分析可以知道,參數(shù)delegate指向的是一個(gè)AwMainDelegate對(duì)象,這個(gè)AwMainDelegate對(duì)象會(huì)被函數(shù)SetContentMainDelegate保存在全局變量gcontentmain_delegate中。這一步執(zhí)行完成后,Chromium動(dòng)態(tài)庫(kù)就在App進(jìn)程中加載完畢,并且也已經(jīng)完成了初始化工作。與此同時(shí),系統(tǒng)也為App進(jìn)程創(chuàng)建了一個(gè)類型為WebViewChromiumFactoryProvider的WebViewFactory?;氐角懊娣治龅腤ebView類的成員函數(shù)ensureProviderCreated中,這時(shí)候就它會(huì)通過(guò)調(diào)用上述類型為WebViewChromiumFactoryProvider的WebViewFactory的成員函數(shù)createWebView為當(dāng)前創(chuàng)建的WebView創(chuàng)建一個(gè)WebView Provider:

WebViewChromiumFactoryProvider類的成員函數(shù)createWebView創(chuàng)建的是一個(gè)類型為WebViewChromium的WebView Provider。這個(gè)WebView Provider將會(huì)返回給WebView類的成員函數(shù)ensureProviderCreated。WebView類的成員函數(shù)ensureProviderCreated再將該WebView Provider保存在成員變量mProvider中。這樣,正在創(chuàng)建的WebView就獲得了一個(gè)類型為WebViewChromium的WebView Provider。以后通過(guò)這個(gè)WebView Provider,就可以通過(guò)Chromium來(lái)加載和渲染網(wǎng)頁(yè)了。

Android System WebView使用攻略

android的WebView組件可以說(shuō)是相當(dāng)?shù)膹?qiáng)大,現(xiàn)將項(xiàng)目中經(jīng)常用到的幾個(gè)功能總結(jié)如下:

一、背景設(shè)置

WebView.setBackgroundColor(0);//先設(shè)置背景色為transparent

WebView.setBackgroundResource(R.drawable.yourImage);//然后設(shè)置背景圖片

二、獲得WebView網(wǎng)頁(yè)加載初始化和完成事件

步驟:

1、創(chuàng)建一個(gè)自己的WebViewClient(繼承 WebViewClient 類)如WebViewClient

2、重載里面的 onPageFinished(WebView view, String url)方法,(webview加載完成會(huì)調(diào)用這個(gè)方法),這個(gè)方法放自己想要做的事情,在webview加載完成以后

3、關(guān)聯(lián)你自己的webviewclient 與 webview 通過(guò) 這個(gè)方法:webView.setWebViewClient( new WebViewClient();

如果需要監(jiān)視加載進(jìn)度的,需要?jiǎng)?chuàng)建一個(gè)自己的WebChromeClient類,并重載方法onProgressChanged

布局文件:

要注意的是,其中的webView的一系列用法,比如 webView.getSettings()。setJavaScriptEnabled(true);設(shè)置可以使用javscript;

等等,具體參考API

而進(jìn)度條的使用是在new出一個(gè)setWebChromeClient后,可以在內(nèi)部類中寫(xiě)  onProgressChanged事件

總結(jié):在WebView的設(shè)計(jì)中,不是什么事都要WebView類干的,有些雜事是分給其他人的,這樣WebView專心干好自己的解析、渲染工作就行了。

WebViewClient就是幫助WebView處理各種通知、請(qǐng)求事件的,具體來(lái)說(shuō)包括:

onLoadResource

onPageStart

onPageFinish

onReceiveError

onReceivedHttpAuthRequest

WebChromeClient是輔助WebView處理Javascript的對(duì)話框,網(wǎng)站圖標(biāo),網(wǎng)站title,加載進(jìn)度等

onCloseWindow(關(guān)閉WebView)

onCreateWindow()

onJsAlert (WebView上alert是彈不出來(lái)東西的,需要定制你的WebChromeClient處理彈出)

onJsPrompt

onJsConfirm

onProgressChanged

onReceivedIcon

onReceivedTitle

《AndroidSystemWebView》軟件亮點(diǎn):

1.幫助用戶提高手機(jī)性能,上網(wǎng)的時(shí)候也能帶來(lái)暢快的瀏覽效果。

2.網(wǎng)頁(yè)的所有數(shù)據(jù)都會(huì)經(jīng)過(guò)深度優(yōu)化,帶來(lái)更好用的輔助插件工具。

3.在系統(tǒng)內(nèi)支持自定義創(chuàng)建不同的組件數(shù)據(jù),使用的穩(wěn)定性特別高。

《AndroidSystemWebView》軟件特色:

1.在網(wǎng)頁(yè)上就可以呈現(xiàn)出各種數(shù)據(jù)無(wú)需安裝指定的應(yīng)用,節(jié)約更多內(nèi)存。

2.在安卓應(yīng)用系統(tǒng)當(dāng)中,可以隨時(shí)打開(kāi)網(wǎng)頁(yè),持續(xù)的推送很多全新的組件數(shù)據(jù),能添加關(guān)注和收藏。

3.音頻,動(dòng)畫(huà),圖形等各種多媒體元素都能一一呈現(xiàn)。

《AndroidSystemWebView》軟件測(cè)評(píng):

能快速穩(wěn)定的幫助用戶更新所有的網(wǎng)頁(yè)數(shù)據(jù),采用了更專業(yè)的架構(gòu)設(shè)計(jì),提供的網(wǎng)頁(yè)信息也會(huì)特別全。

需要網(wǎng)絡(luò) 免費(fèi) 無(wú)需谷歌市場(chǎng)
展開(kāi)
詳細(xì)信息
  • 游戲大小: 225.60 M
  • 游戲版本:v130.0
  • 系統(tǒng)要求:安卓4.4
  • 更新時(shí)間:2024-10-30 13:36:01
  • 權(quán)限說(shuō)明:查看詳情
  • 隱私說(shuō)明:查看隱私
  • 語(yǔ)言:中文
  • 開(kāi)發(fā)者:Google Inc.
  • 包名:23AC48C8928995D09CB1EC24775D45D9
  • MD5:com.google.android.webview

應(yīng)用 截圖

應(yīng)用 推薦

  • 導(dǎo)航
  • 瀏覽器
導(dǎo)航

導(dǎo)航

導(dǎo)航是一個(gè)研究領(lǐng)域,重點(diǎn)是監(jiān)測(cè)和控制工藝或車(chē)輛從一個(gè)地方移動(dòng)到另一個(gè)地方的過(guò)程。 導(dǎo)航領(lǐng)域包括四個(gè)一般類別:陸地導(dǎo)航,海洋導(dǎo)航,航空導(dǎo)航和空間導(dǎo)航。這也是用于導(dǎo)航員執(zhí)行導(dǎo)航任務(wù)所使用的專業(yè)知識(shí)的藝術(shù)術(shù)語(yǔ)。 所有導(dǎo)航技術(shù)都涉及定位與已知位置或模式相比較的導(dǎo)航儀的位置。在更廣泛的意義上,導(dǎo)航可以指涉及確定位置和方向的任何技能或研究。在這個(gè)意義上,導(dǎo)航包括定向運(yùn)動(dòng)和行人導(dǎo)航。

瀏覽器

瀏覽器

網(wǎng)頁(yè)瀏覽器(英語(yǔ):web browser),常被簡(jiǎn)稱為瀏覽器,是一種用于檢索并展示萬(wàn)維網(wǎng)信息資源的應(yīng)用程序。這些信息資源可為網(wǎng)頁(yè)、圖片、影音或其他內(nèi)容,它們由統(tǒng)一資源標(biāo)志符標(biāo)志。信息資源中的超鏈接可使用戶方便地瀏覽相關(guān)信息。

  • 下載排行榜
  • 熱門(mén)排行榜
8

頭七怪談?dòng)螒?

休閑益智
  • 9

    開(kāi)局已是巔峰小游戲

    休閑益智
  • 10

    哥布林巢穴繁殖物語(yǔ)桃子移植版

    角色扮演
  • 熱門(mén)分類