Android Webview太烂?试试Webview独立进程吧
2017-02-08 本文已影响13267人
dengyin2000
H5页面非常适合用来呈现一些日常活动页面,甚至App中某些非核心功能都可以用H5来实现,这样能快速更新,而且多平台通用,极大的节约开发成本。所以现在H5页面在App中的占比越来越大。但是Android的Webview有着非常多的问题,例如:内存占用巨大,存在内存泄露,崩溃率高等。
Webview的问题
- 内存占用巨大
app内存占用大,被系统回收的概率就高,当你每次把app切到后台再回到app时,可能每次你的app都会重启。内存占用大,app越不稳定。运行性能差。 - 内存泄露
本来Webview的内存占用就大,你还内存泄露,OOM是经常的了。 - Webview崩溃率高
本人在某家电商公司搬砖,每当XXX大促时,app的崩溃率能上升千分之三。就是因为大促时百分之六、七十的页面都是H5的。
什么是Webview独立进程
app可以存在多个独立进程,我们可以指定某些Activity、Service等运行在不同的进程。Webview占用内存大、问题多,所以把Webview放到独立进程中。
为什么要这样做
- 每个独立的进程都能分配独立的内存,这样的话,你的app可以获得双倍的内存,其中一半给Webview吃。增大Webview获得的内存,变相的减小内存泄露产生OOM的概率。
- 在适当时机直接杀掉Webview独立进程,什么内存泄露,内存占用巨大的问题都见鬼去吧。要问什么时机?比如退出app时,检测到没有Webview页面时。
- 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进程。请看下图:
同步示例- H5进程通过aidl跨进程调用方式从主进程获取需要同步的数据。
- 主进程通过Android广播通知H5进程发生什么事件,有什么事件?比如:
1.主进程全局变量值变了,通知H5进程来拿。
2.app返回到首页没有Webview页面了,通知H5进程你可以自杀了。 - 对于一些持久化的数据,我这里是通过Content Provider来访问SharedPreferences。可能有些骚年会说SharedPreferences不是提供了Context.MODE_MULTI_PROCESS多进程的访问模式吗?之前我也是这么想的,可是上线后发现一大堆线上数据同步问题,说多了都是泪,看看javaDoc怎么说的。