webview安全漏洞詳解
-
1.Webview常見(jiàn)的一些坑
- Android API level 16 以及之前的版本存在遠(yuǎn)程代碼執(zhí)行安全漏洞,該漏洞源于程序沒(méi)有正確限制使用WebView.addJavascriptInterface方法,遠(yuǎn)程攻擊者可通過(guò)使用Java Reflection API利用該漏洞執(zhí)行任意Java對(duì)象的方法
- webview在布局文件中的使用,webview寫(xiě)在其他容器中時(shí)诅蝶,當(dāng)離開(kāi)界面時(shí),需要銷毀webView砌滞,在onDestroy時(shí),一定要先將webview從容器中remove贝润,然后再調(diào)用webview的removeAllViews,和webView的ondestroy方法才不會(huì)導(dǎo)致內(nèi)存泄露問(wèn)題
- jsbridge
通過(guò)js構(gòu)建橋铝宵,為了讓native調(diào)用遠(yuǎn)端js的代碼打掘,也可以讓js代碼調(diào)用native代碼
- jsbridge
- webViewClient.onPageFinished-->WebChromeClient.onProgessChanged
onPageFinished:加載完成時(shí)會(huì)回調(diào)這個(gè)方法。檢測(cè)當(dāng)前網(wǎng)頁(yè)是否加載完畢尊蚁。如果當(dāng)前網(wǎng)頁(yè)產(chǎn)生跳轉(zhuǎn),這個(gè)方法會(huì)執(zhí)行無(wú)數(shù)次横朋,當(dāng)webview需要加載各種網(wǎng)頁(yè)仑乌,并且在網(wǎng)頁(yè)上有一些操作時(shí),最好還是調(diào)用WebChromeClient.onProgessChanged()方法琴锭,這方法靠譜些
- webViewClient.onPageFinished-->WebChromeClient.onProgessChanged
- 后臺(tái)耗電:性能優(yōu)化晰甚,當(dāng)程序開(kāi)webView加載網(wǎng)頁(yè)時(shí)决帖,webview會(huì)自己開(kāi)啟線程厕九,如果沒(méi)有很好的將webview銷毀的話地回,這個(gè)殘留的線程就會(huì)一直在后臺(tái)運(yùn)行,而導(dǎo)致應(yīng)用程序居高不下穿香。
粗暴處理:在onDetroy時(shí)直接調(diào)用system.exit直接把虛擬機(jī)關(guān)閉
- 后臺(tái)耗電:性能優(yōu)化晰甚,當(dāng)程序開(kāi)webView加載網(wǎng)頁(yè)時(shí)决帖,webview會(huì)自己開(kāi)啟線程厕九,如果沒(méi)有很好的將webview銷毀的話地回,這個(gè)殘留的線程就會(huì)一直在后臺(tái)運(yùn)行,而導(dǎo)致應(yīng)用程序居高不下穿香。
- WebView硬件加速導(dǎo)致頁(yè)面渲染問(wèn)題
容易出現(xiàn)頁(yè)面加載白塊绎速,頁(yè)面閃爍的現(xiàn)象
處理:設(shè)置WebView暫時(shí)關(guān)閉硬件加速
- WebView硬件加速導(dǎo)致頁(yè)面渲染問(wèn)題
-
2.關(guān)于webView的內(nèi)存泄露問(wèn)題
- WebView加載會(huì)創(chuàng)建自己的線程皮获,這個(gè)線程跟Activity的生命周期是未綁定纹冤,無(wú)法控制。 跟匿名內(nèi)部類引用萌京,導(dǎo)致外部?jī)?nèi)無(wú)法回收相似。
獨(dú)立進(jìn)程靠瞎,簡(jiǎn)單暴力求妹,不過(guò)可能涉及到進(jìn)程間通信(用的多,防止內(nèi)存泄露制恍,減輕主進(jìn)程的內(nèi)存壓力)
動(dòng)態(tài)添加WebView,對(duì)傳入WebView中使用的Context使用弱引用净神,動(dòng)態(tài)添加WebView的意思是布局創(chuàng)建一個(gè)ViewGroup用來(lái)放置WebView溉委,Activity創(chuàng)建時(shí)add進(jìn)來(lái)爱榕,在Activity停止時(shí)remove掉