Android葵花宝典android基础Android 小技巧

Android Webview太烂?试试Webview独立进程吧

2017-02-08  本文已影响13267人  dengyin2000

H5页面非常适合用来呈现一些日常活动页面,甚至App中某些非核心功能都可以用H5来实现,这样能快速更新,而且多平台通用,极大的节约开发成本。所以现在H5页面在App中的占比越来越大。但是Android的Webview有着非常多的问题,例如:内存占用巨大,存在内存泄露,崩溃率高等。

Webview的问题

  1. 内存占用巨大
    app内存占用大,被系统回收的概率就高,当你每次把app切到后台再回到app时,可能每次你的app都会重启。内存占用大,app越不稳定。运行性能差。
  2. 内存泄露
    本来Webview的内存占用就大,你还内存泄露,OOM是经常的了。
  3. Webview崩溃率高
    本人在某家电商公司搬砖,每当XXX大促时,app的崩溃率能上升千分之三。就是因为大促时百分之六、七十的页面都是H5的。

什么是Webview独立进程

app可以存在多个独立进程,我们可以指定某些Activity、Service等运行在不同的进程。Webview占用内存大、问题多,所以把Webview放到独立进程中。

为什么要这样做

  1. 每个独立的进程都能分配独立的内存,这样的话,你的app可以获得双倍的内存,其中一半给Webview吃。增大Webview获得的内存,变相的减小内存泄露产生OOM的概率。
  2. 在适当时机直接杀掉Webview独立进程,什么内存泄露,内存占用巨大的问题都见鬼去吧。要问什么时机?比如退出app时,检测到没有Webview页面时。
  3. Webview发生崩溃时不会导致app闪退,就像第二点说的,因为Webview是在独立进程中,如果发生崩溃,主进程还安然无事,app还在运行中,没有闪退,不闪的才是健康的。

如何做?

修改AndroidManifest.xml

        <activity
            android:name=".WebviewActivity"
            android:process=":h5"
            android:screenOrientation="portrait"
            android:configChanges="orientation|screenSize|keyboardHidden"
        />

这样WebviewActivity就运行在:h5这个进程了。就指定个process就可以了?这么简单?别急、还有个坑要填一下。

数据同步问题

大家在开发中都习惯把一些全局性的变量保存在Android的Application或者单例类中,如果这时候我在app主进程修改了一个全局变量,这时候在WebviewActivity中去读这个值时你会发现不是修改后的值,坑爹了,想想为什么会这样,因为WebviewActivity是独立进程,不共享一份内存,这时候Application都是两个不同的实例。OK,现在你要做的就是在适当的时机把主进程的值同步到H5进程。请看下图:

同步示例
  1. H5进程通过aidl跨进程调用方式从主进程获取需要同步的数据。
  2. 主进程通过Android广播通知H5进程发生什么事件,有什么事件?比如:
    1.主进程全局变量值变了,通知H5进程来拿。
    2.app返回到首页没有Webview页面了,通知H5进程你可以自杀了。
  3. 对于一些持久化的数据,我这里是通过Content Provider来访问SharedPreferences。可能有些骚年会说SharedPreferences不是提供了Context.MODE_MULTI_PROCESS多进程的访问模式吗?之前我也是这么想的,可是上线后发现一大堆线上数据同步问题,说多了都是泪,看看javaDoc怎么说的。
图2
上一篇下一篇

猜你喜欢

热点阅读