【移动应用开发技术】Android 5.1应用中 WebView出现内存泄漏如何解决_第1页
【移动应用开发技术】Android 5.1应用中 WebView出现内存泄漏如何解决_第2页
【移动应用开发技术】Android 5.1应用中 WebView出现内存泄漏如何解决_第3页
【移动应用开发技术】Android 5.1应用中 WebView出现内存泄漏如何解决_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Android5.1应用中WebView出现内存泄漏如何解决

今天就跟大家聊聊有关Android5.1应用中WebView出现内存泄漏如何解决,可能很多人都不太了解,为了让大家更加了解,在下给大家总结了以下内容,希望大家根据这篇文章可以有所收获。问题背景在排查项目内存泄漏过程中发现了一些由WebView引起的内存泄漏,经过测试发现该部分泄漏只会出现在android5.1及以上的机型。虽然项目使用WebView的场景并不多,但秉承着一个泄漏都不放过的精神,我们肯定要把它给解决了。遇到的问题项目中使用WebView的页面主要在FAQ页面,问题也出现在多次进入退出时,发现内存占用大,GC频繁。使用LeakCanary观察发现有两个内存泄漏很频繁:

我们分析一下这两个泄漏:从图一我们可以发现是WebView的ContentViewCore中的成员变量mContainerView引用着AccessibilityManager的mAccessibilityStateChangeListeners导致activity不能被回收造成了泄漏。引用关系:mAccessibilityStateChangeListeners->ContentViewCore->WebView->SettingHelpActivity从图二可以发现引用关系是:mComponentCallbacks->AwContents->WebView->SettingHelpActivity问题分析我们找找mAccessibilityStateChangeListeners与mComponentCallbacks是在什么时候注册的,我们先看看mAccessibilityStateChangeListenersAccessibilityManager.java上面这几个方法是在AccessibilityManager.class中定义的,根据方法调用可以发现在ViewRootImpl初始化会调用addAccessibilityStateChangeListener添加一个listener,然后会在dispatchDetachedFromWindow的时候remove这个listener。既然是有remove的,那为什么会一直引用着呢?我们稍后再分析。我们再看看mComponentCallbacks是在什么时候注册的Application.java上面这两个方法是在Application中定义的,根据方法调用可以发现是在Context基类中被调用根据泄漏路径,难道是AwContents中注册了mComponentCallbacks未反注册么?只有看chromium源码才能知道真正的原因了,好在chromium是开源的,我们在android5.1Chromium源码中找到我们需要的AwContents(自备梯子),看下在什么时候注册了AwContents.java在以上两个方法中我们发现了mComponentCallbacks的踪影,在onAttachedToWindow的时候调用mContext.registerComponentCallbacks(mComponentCallbacks)进行注册,在onDetachedFromWindow中反注册。我们仔细看看onDetachedFromWindow中的代码会发现如果在onDetachedFromWindow的时候isDestroyed条件成立会直接return,这有可能导致无法执行mContext.unregisterComponentCallbacks(mComponentCallbacks);也就会导致我们第一个泄漏,因为onDetachedFromWindow无法正常流程执行完也就不会调用ViewRootImp的dispatchDetachedFromWindow方法,那我们找下这个条件什么时候会为true发现是在destroy中设置为true的,也就是说执行了destroy()就会导致无法反注册。我们一般在activity中使用webview时会在onDestroy方法中调用mWebView.destroy();来释放webview。根据源码可以知道如果在onDetachedFromWindow之前调用了destroy那就肯定会无法正常反注册了,也就会导致内存泄漏。问题的解决我们知道了原因后,解决就比较容易了,就是在销毁webview前一定要onDetachedFromWindow,我们先将webview从它的父view中移除再调用destroy方法,代码如下:还有个问题,就是为什么在5.1以下的机型不会内存泄漏呢,我们看下4.4的源码AwContents我们可以看到在onDetachedFromWindow方法上是没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论