关于webview在华为mate系列等机型上的崩溃

356 阅读2分钟

问题:

使用flutter插件开发方式,将x5引擎集成到工程,为flutter提供webview widget。但在华为mate系列手机上(目前在华为mate30)浏览H5页面时偶现crash.

崩溃日志:

crashlog.png

1.jpg

2.jpg

从崩溃日志可以看出先是Fatal process out of memory: Failed to reserve memory for new V8 Isolate,表象就是oom,引发了华为webview so的崩溃。没有任何具体代码业务模块的堆栈日志。

解决方案:

oom类的问题,首先需要排查页面是否有内存泄漏,于是对页面进入前,进入中,退出后内存进行监控:

memery.jpg 在webview内并没有发现明显的内存占用,但是在退出页面后,内存没有降下来,再次进入浏览页面,再退出,内存一直慢慢上涨。当前实现方法是flutter插件的形式,在flutter内一切页面均是widget,在widget的销毁时,原生webview的内存释放我们是没有单独处理的。联想到在原生Android开发时,webview内存泄漏相关解决办法:

1、context最好不使用activity,而使用application context。(在flutter应用不存在此问题,因为所有flutter页面都在一个mainactivity内)
2、页面销毁时,释放掉webview的内存:
webview?.stopLoading()

webview?.settings?.javaScriptEnabled = false

webview?.clearHistory() 

// 清除了缓存这步需要权衡,会导致页面整体加载变慢
webview?.clearCache(true)

webview?.removeAllViewsInLayout() 

webview?.removeAllViews() 

webview?.destroy() 

webview = null

这段代码放在flutter插件platformView 的dispose方法时调用,暂时修复了这个崩溃。各个手机厂商的内存管理机制不一样,关于为何只在华为手机上出现这个崩溃,很无解。在Android原生开发中对webview的内存泄漏的优化方式同样也可用在了flutter开发中。