十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
Android Webkit Browser指的是
成都創(chuàng)新互聯(lián)公司成都網(wǎng)站建設(shè)按需規(guī)劃網(wǎng)站,是成都網(wǎng)站建設(shè)公司,為成都PVC花箱提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站設(shè)計(jì)熱線:18982081108
Android下的采用Webkit內(nèi)核的瀏覽器
WebKit 是一個(gè)開(kāi)源的瀏覽器引擎,與之相對(duì)應(yīng)的引擎有Gecko(Mozilla Firefox 等使用)和Trident(也稱MSHTML,IE使用)。同時(shí)WebKit 也是蘋(píng)果Mac OS X 系統(tǒng)引擎框架版本的名稱,主要用于Safari,Dashboard,Mail 和其他一些Mac OS X 程序。WebKit 前身是 KDE 小組的 KHTML,WebKit 所包含的 WebCore 排版引擎和 JSCore 引擎來(lái)自于 KDE 的 KHTML 和 KJS,當(dāng)年蘋(píng)果比較了 Gecko 和 KHTML 后,仍然選擇了后者,就因?yàn)樗鼡碛星逦脑创a結(jié)構(gòu)、極快的渲染速度。
Android模擬器默認(rèn)的地址是10.0.2.3,默認(rèn)的DNS也是10.0.2.3,對(duì)于在家里上網(wǎng)學(xué)習(xí)Android的人來(lái)講,一般電腦的IP都是192.168.1.100之類的,不在同一個(gè)網(wǎng)段。所以就會(huì)出現(xiàn)電腦可以上網(wǎng)但是模擬器不能上網(wǎng)的情況。其實(shí)設(shè)置方法很簡(jiǎn)單,只要把模擬器的默認(rèn)DNS設(shè)置成電腦的DNS地址即可。
第一步:用系統(tǒng)的命令進(jìn)入Android開(kāi)發(fā)包的tools目錄
cd X:\...\android-sdk-windows\tool
第二布:使用adb的shell,確認(rèn)系統(tǒng)的各項(xiàng)屬性
adb shell
getprop
getprop會(huì)列出系統(tǒng)當(dāng)前的各項(xiàng)屬性
第三步:得到模擬器的DNS地址
在結(jié)果里可以看到:
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]
第四步:把dns改成我們自己的DNS
setprop net.dns1 192.168.1.1
注:一般TP-LINK及D-LINK的DNS都是192.168.1.1,如果不是請(qǐng)使用ipcnofig /all命令確認(rèn)。
[img]1. 找到你的toolchain對(duì)應(yīng)的gdb,在模擬器上是arm-eabi-gdb,在prebuild下,把它的目錄加到PATH里面
export PATH=$ANDROID_SRC/prebuilt/linux-x86/tootlchain/arm-eabi-4.4.0/bin:$PATH
或者直接加到~/.bashrc里面
2 執(zhí)行配置腳本
cd$ANDROID_SRC
source build/envsetup.sh
3 啟動(dòng)模擬器,運(yùn)行瀏覽器
l gdbclient app_ process :5039 browser
此時(shí)就能看到gdb順利啟動(dòng)起來(lái)了(盡管有warning),此時(shí)就可以使用你熟悉的gdb命令了
看到
15 ldmdf sp! {r4,r7}
Currentlanguage: auto;current asm
4 設(shè)置斷點(diǎn)
bFrameLoaderClientAndroid.cpp:868
5 執(zhí)行
c
6 訪問(wèn)一個(gè)網(wǎng)址,就可以看到gdb斷點(diǎn)了,enjoy it!
背景:原生時(shí)間緊沒(méi)時(shí)間開(kāi)發(fā)任務(wù)量大的任務(wù),而前端又閑著打醬油
方案:原生+webview混合開(kāi)發(fā)
缺點(diǎn):對(duì)于比較復(fù)雜的頁(yè)面,webview在性能上力不從心;且與原生通信頻繁也增加了隱藏的工作量
優(yōu)點(diǎn):能自帶支持動(dòng)態(tài)更新(js),能充分利用人力
webview是一個(gè)基于webkit引擎,展示web頁(yè)面的控件。Android上的webview在低版本和高版本采用了不同的webkit版本內(nèi)核,Android4.4(19)后直接使用了Chrome內(nèi)核;WebView控件功能強(qiáng)大,除了具有一般View的屬性和設(shè)置外,還可以對(duì)url請(qǐng)求,頁(yè)面加載,渲染,頁(yè)面交互進(jìn)行強(qiáng)大的處理。一般來(lái)說(shuō)webview可單獨(dú)使用,也可聯(lián)合其工具類一起使用
移動(dòng)應(yīng)用的主體是webview,主要以網(wǎng)頁(yè)語(yǔ)言編寫(xiě),穿插Native功能的Hybrid App開(kāi)發(fā)類型。激活webview為活躍狀態(tài),能正常執(zhí)行網(wǎng)頁(yè)的響應(yīng);當(dāng)webview 的頁(yè)面被失去焦點(diǎn)切換到后臺(tái)不可見(jiàn)狀態(tài)onPause時(shí),需要通知自己暫停所有的動(dòng)作,比如DOM的解析,plugin的執(zhí)行,JavaScript的執(zhí)行等
1,顯示和渲染web頁(yè)面
2,直接使用本地assets或者網(wǎng)絡(luò)上的html文件作為布局
3,可和JavaScript進(jìn)行互相調(diào)用
1,直接在布局文件里寫(xiě)死
2,動(dòng)態(tài)添加進(jìn)viewgroup中
注:不管以哪種方式,都必須注意webview的銷(xiāo)毀,否則可能會(huì)造成內(nèi)存泄漏最終導(dǎo)致內(nèi)存溢出crash
下面是WebView的一些常用的方法列舉,一些已經(jīng)過(guò)時(shí)的方法未列出
下面是WebSettings的一些常用的方法列舉,一些已經(jīng)過(guò)時(shí)的方法就沒(méi)有寫(xiě)出來(lái)了
一般不管是動(dòng)態(tài)生成還是xml寫(xiě)死,只要處理好了引用持有問(wèn)題,就能有效的避免內(nèi)存泄漏;下面是我嘗試的方案,在工具類WebViewUtils.java里封裝好,在activity銷(xiāo)毀的時(shí)候調(diào)用
1,清除webview緩存和記錄
2,可以設(shè)置不啟用緩存
3,H5的一些控件標(biāo)簽不支持導(dǎo)致的白屏
4,xml啟用軟件加速
5,通過(guò)menifest的來(lái)配置,在目標(biāo)webview的activity設(shè)置
解決方案:
解決方案:
解決方案:
上一篇: Flutter入門(mén)-01-工程創(chuàng)建目錄介紹
android本來(lái)自帶了webkit瀏覽器,但是要對(duì)其進(jìn)行custom就需要android源代碼才行, 但是在沒(méi)有源碼的情況下,那么就需要用到ndk了,比如,我是在xoom上做custom webkit的。 雖然ndk提供的庫(kù)很少,而且沒(méi)有skia,但是好在有bitmap,這樣顯示慢了點(diǎn),沒(méi)有硬加速,但不是不可能。 webkit需要的第三方庫(kù),freetype,png,jpeg,sqlite3等雖然android源碼中有,但是ndk沒(méi)有開(kāi)放, 因此所有的第三方庫(kù),freetype,png,jpeg,sqlite3,cairo,curl,fontconfig,pixman,iconv等 都需要用ndk cross-compile成靜態(tài)庫(kù),然后鏈接到最終的動(dòng)態(tài)庫(kù)中。 選擇iconv是icu太大,而且沒(méi)有多語(yǔ)言的需求,選擇cairo+pixman是skia的移植性不好,而且cairo支持很多種backend。 編譯第三方庫(kù)需要用到autoconfig,ndk中有如何生成交叉編譯鏈的文檔,然后在configure時(shí)使用這個(gè)工具鏈就可以了, 但是android用到的是bionic庫(kù),因此會(huì)有很少的地方需要修改,有些庫(kù)也不能生成test程序,但是靜態(tài)庫(kù)是沒(méi)問(wèn)題的。 利用ndk生成的交叉工具鏈,在加上webkit自帶的cmake編譯系統(tǒng),生成webkit的動(dòng)態(tài)庫(kù)是沒(méi)有問(wèn)題的, 當(dāng)然是webkit的內(nèi)核,而且有些平臺(tái)相關(guān)的部分代碼需要修改,但是只要是以linux平臺(tái)為基礎(chǔ),修改還是很容易的, 我移植的webkit是先移植到linux平臺(tái)上,然后移植到android平臺(tái)上的,所以修改相對(duì)少了很多, 但是修改大多都在WebCore/platform下,在選擇了的平臺(tái)相關(guān)庫(kù)后,做相應(yīng)的配置和修改, 其次是在WebKit目錄,這個(gè)主要是支持和使用WebCore,因此在需求不是整個(gè)瀏覽器,而只是正常地顯示網(wǎng)頁(yè)時(shí), 還是可以寫(xiě)的比較簡(jiǎn)單的。
[TOC]
Webkit是一個(gè)開(kāi)源瀏覽器項(xiàng)目,其中,對(duì)Android開(kāi)發(fā)者來(lái)說(shuō),或多或少的都有些接觸。 在應(yīng)用層來(lái)看,最經(jīng)常使用無(wú)非這么幾個(gè)類:WebView(Android中最為復(fù)雜,也是最為簡(jiǎn)單的一個(gè)View,繼承自AbsoluteLayout),WebViewClient、WebChromeClient(作為回調(diào)控制類)、WebSettings(進(jìn)行設(shè)置項(xiàng)的配置)等;Webkit內(nèi)部包含了網(wǎng)絡(luò)請(qǐng)求、頁(yè)面渲染、Js引擎等等。在Android4.4之前的版本中,系統(tǒng)使用的是Webkit內(nèi)核,其后,切換到Google的Chromium內(nèi)核。本文主要介紹的是在Android中,如何使用Webkit進(jìn)行H5頁(yè)面的展現(xiàn),以及常見(jiàn)問(wèn)題的分析手段。
下面的內(nèi)容抄自百度百科 亂七八糟的地方,簡(jiǎn)單了解一下。
bi前面都是吹牛逼的信息,如何使用Webkit來(lái)更好的搬磚? 且聽(tīng)如下分解/i/b
XML布局中丟一個(gè) WebView 標(biāo)簽,然后再 Activity 或者 Fragment 中 findViewById ,進(jìn)而 loadUrl ,一般也沒(méi)人這么簡(jiǎn)單的用,除非寫(xiě)Demo。很簡(jiǎn)單,它就是一個(gè)Layout,提供了一個(gè)調(diào)用加載頁(yè)面的接口,不寫(xiě)范例了,能看到這篇文章的都看過(guò)Google的API說(shuō)明。
主要涉及到WebView和WebSettings兩個(gè)類。
例如:
其實(shí)就是WebView的父類ViewGroup和View的方法,不多說(shuō)了。不過(guò)需要注意的是,不是所有的View或ViewGroup的方法對(duì)WebView都生效。
列舉幾類常用的,幾乎所有App的 WebView 都會(huì)設(shè)置的屬性:
/br
如何處理頁(yè)面跳轉(zhuǎn)以及特殊 Scheme
這個(gè)回調(diào)可以說(shuō)是最容易出問(wèn)題的一個(gè)回調(diào),表示什么? 字面意思,讓你重寫(xiě)這個(gè)URL 的loading,比如點(diǎn)擊html打電話的一個(gè) a href=“tel:110” 標(biāo)簽,作為一個(gè)有節(jié)操、有責(zé)任心的瀏覽器,你需要處理 H5常用的幾個(gè)Scheme :
除此之外,還有各個(gè)應(yīng)用自定義的scheme ,舉個(gè)例子,支付寶的支付Scheme : alipay: 。 這里的返回值,就代表你有沒(méi)有能力處理這個(gè)url,沒(méi)有的話Webkit就默認(rèn)處理了。
需要注意的是,這個(gè)回調(diào)的觸發(fā)的絕大多數(shù)情況是點(diǎn)擊頁(yè)面的 a href="xxxx" a標(biāo)簽,在Android中 loadUrl("") ,是不會(huì)回調(diào)的,為什么不會(huì)回調(diào),各位自行理解吧。
超鏈接 a 標(biāo)簽怎么寫(xiě): 點(diǎn)我
特別說(shuō)下窗口常見(jiàn)的兩種打開(kāi)方式:
針對(duì)單頁(yè)模式的WebView框架(所有的html窗口均使用同一個(gè)WebView實(shí)例),不需要關(guān)注target的。
如果作為一個(gè)成熟的瀏覽器框架的話,是需要支持Html、JavaScript使用新窗口打開(kāi)頁(yè)面,需要實(shí)現(xiàn)如下回調(diào):
還有一個(gè)相關(guān)設(shè)置項(xiàng): WebSettings.setJavaScriptCanOpenWindowsAutomatically
此時(shí),系統(tǒng)將不會(huì)再回調(diào) shouldOverrideUrlLoading 。新窗口邏輯的具體實(shí)現(xiàn)機(jī)制,可以參考系統(tǒng)browser實(shí)現(xiàn)邏輯。
b 這里有個(gè)坑 /b
Android 4.4版本 ,如果實(shí)現(xiàn)了onCreateWindow,也就是說(shuō)頁(yè)面 a 標(biāo)簽是這么寫(xiě)的: a href="" target="_blank" ,點(diǎn)擊此鏈接打開(kāi)的新WebView窗口,此窗口中的url點(diǎn)擊,是不會(huì)觸發(fā) shouldOverrideUrlLoading 。 這是剛替換成Chrominum內(nèi)核出的一個(gè)bug。本人并沒(méi)在新版本上驗(yàn)證是否已經(jīng)修復(fù)。
另外,根據(jù)不同的Rom,底層實(shí)現(xiàn)是不一樣的,有的ROM會(huì)幫你處理各種調(diào)起scheme,也就是startActivity,有的ROM點(diǎn)一個(gè)url,就會(huì)拋一個(gè)intent出來(lái),讓用戶選擇系統(tǒng)瀏覽器進(jìn)行加載。
系統(tǒng)默認(rèn),提供了一個(gè)接口:
有什么安全隱患呢?
戳這里
如果不知道Js怎么寫(xiě), 請(qǐng)戳我
用PC的截圖意思一下,看出區(qū)別了吧。 這里確定、取消點(diǎn)擊以后就得調(diào)用 JsResult、JsPromptResult 的 confirm或者cancel。
因?yàn)榘踩珕?wèn)題,大一些的App Native與Js通信都不再用 WebView.addJavascriptInterface(Object) 了,都改用JsPrompt,因?yàn)镴sPrompt中有message、有JsPromptResult可以返回給Js一些信息,所以橋選中了JsPrompt,另一個(gè)備選方案是JsConsole。
大體有這么幾種方式進(jìn)行傳遞
具體方案實(shí)現(xiàn)時(shí),多方面考慮使用何種方式。
還有一個(gè)比較牛逼的
系統(tǒng)源碼中均有方法注釋,怎么用自己看吧。
那么問(wèn)題來(lái)了
查了下,只有這兩個(gè)相關(guān)的:
WebBackForwardList copyBackForwardList()
void clearHistory()
系統(tǒng)提供的關(guān)于歷史記錄的操作并不多,因?yàn)?,不支持單條刪除啊,啊啊?。?/p>
WebViewClient中,還有一個(gè)相關(guān)callback,當(dāng)系統(tǒng)更新歷史記錄時(shí)回調(diào):
void doUpdateVisitedHistory(WebView view, String url, boolean isReload)
b相關(guān)問(wèn)題分析法:歷史?;赝隋e(cuò)誤的定位/b
絕大多數(shù)回退錯(cuò)誤是由于接口調(diào)用、回調(diào)中邏輯執(zhí)行時(shí)序錯(cuò)誤。
定位方法:利用 copyBackForwardList , doUpdateVisitedHistory 兩個(gè)接口在 loadUrl、onPageStart、onPageFinish 以及邏輯相關(guān)的地方調(diào)用,打log,查看歷史棧,這里注意下由于loadurl是異步的,需要考慮是否加延遲等等保證調(diào)用時(shí)機(jī)的準(zhǔn)確。
本人曾經(jīng)遇到一個(gè)問(wèn)題:在WebChromeClient中的 JsPrompt回調(diào)中,直接進(jìn)行WebView.goBack操作,結(jié)果發(fā)現(xiàn)WebView確實(shí)回退到上一個(gè)頁(yè)面,但是BackFowardList當(dāng)前頁(yè)面的index未更新的問(wèn)題,具體見(jiàn)另一個(gè)篇blog。
網(wǎng)上有很多關(guān)于WebView內(nèi)存泄露的討論,據(jù)傳,老版本的WebView在展示大量圖片的時(shí)候,即使 WebView.destory() WebView=null ,也不會(huì)銷(xiāo)毀。
在新版本上,實(shí)際測(cè)試結(jié)果:compileSDKVersion 23 不會(huì)泄露。
一般,我們?nèi)绾武N(xiāo)毀WebView比較保險(xiǎn)?
這個(gè)問(wèn)題好大。。。
暫時(shí)不介紹,另起blog進(jìn)行說(shuō)明。
解決方案:
實(shí)現(xiàn)回調(diào) void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error)
首先,提幾個(gè)需要注意的點(diǎn):
個(gè)人歸納總結(jié)幾點(diǎn):
step1 進(jìn)入開(kāi)發(fā)者模式,勾選“顯示布局邊界”;
step 2,回到你想查看的界面; step 3 假如內(nèi)容區(qū)只有一層基本就是H5 WebView的,多個(gè)層級(jí),就是Native。
看到左右圖的差異了吧。
還有另一種方法,RD屌絲們看這里,特別說(shuō)明,這種方法不太適合瀏覽器。 (自有內(nèi)核,可能會(huì)不準(zhǔn)確)
好了,就介紹到這里,零零散散的幾年前寫(xiě)的文章,第一篇blog,如有不對(duì)的地方,還懇請(qǐng)大家指正。