Android WebView 优化

随着app的迭代,嵌入的html5界面越来越多了,WebView这个强大组件引起的问题越发的多起来,实际使用就需要对其做些优化。

使用WebView的过程中主要碰到的问题是:

  • WebView导致的oom问题
  • Android版本不同,采用了不同的内核,兼容性crash
  • 不同版本实现不同,甚至URI不规范也会引起不同程度的问题

OOM及导致的卡顿基本是因为其占用的内存太大,可以参考微信的做法将webview放在一个单独的进程中架构案例丨微信Android客户端架构演进之路),这样的好处有:

  • 有效增大App的运存,减少由webview引起的内存泄露对主进程内存的占用。
  • 避免WebView的Crash影响App主进程的运行。
  • 拥有对WebView独立进程操控权。

WebView进程与其他进程通讯的方式,把webview独立进程之后会发现,埋点功能和接收主进程数据都不正常了,这里就涉及到进程间通讯的问题了;进程通讯无非就是那几种,aidl,messager,content provider,广播;基本采用广播的方式是比较简单和合适的。

WebView硬件加速导致页面渲染闪烁

4.0以上的系统我们开启硬件加速后,WebView渲染页面更加快速,拖动也更加顺滑。但有个副作用就是,当WebView视图被整体遮住一块,然后突然恢复时(比如使用SlideMenu将WebView从侧边滑出来时),这个过渡期会出现白块同时界面闪烁。解决这个问题的方法是在过渡期前将WebView的硬件加速临时关闭,过渡期后再开启,代码如下:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

html5跳原生界面

网页跳原生界面的方法有很多种,比如js调java方法,或者JSBridge,或者是通过uri scheme啦,也可以通过自己解析url来做。通过重写WebViewClientshouldOverrideUrlLoading方法来进行拦截将要加载的URL. 关于addJavascriptInterface在4.2版本以下的设备会出现的问题,参考 http://drops.wooyun.org/papers/548,可以选择使用JsBridge

WebView缓存

可以通过使用缓存来减少网络请求,从而加快网页的响应。 1)优先使用缓存:webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
2)不使用缓存:webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);