



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年汽车轻量化材料在汽车轻量化车身制造工艺中的应用趋势报告
- 现场品质培训课件
- 2025年智能制造示范工厂建设中的环保与可持续发展实施方案报告
- 2025年数字艺术产业报告:作品创作、交易与版权保护市场风险与机遇分析
- 现场传授式专业知识培训课件
- 2026届浙江省杭州市西湖区杭州学军中学化学高二上期末统考模拟试题含答案
- 浙江省杭州市杭州第二中学2026届化学高一第一学期期中监测试题含解析
- 2026届贵州省遵义市务川民族中学化学高二上期末质量跟踪监视试题含答案
- 现代水文学研究生课件
- 2026届广西岑溪市高一化学第一学期期末联考模拟试题含解析
- 医疗纠纷防范培训
- 资产并购咨询合同模板
- 字画作品买卖合同模板
- 人教PEP版小学英语五年级下册复习教案(全册)
- 2024年初中数学人教版七年级上册新教材培训心得体会
- NB-T 33025-2020 电动汽车快速更换电池箱通.用要求
- 延保服务合同范本
- 【小升初】2024-2025学年四川省成都市下学期新七年级分班真题数学试题(含答案)
- 广东省深圳市2022-2023学年八年级下学期英语期末试卷(含答案)
- DB32-T 1510-2015升降作业平台检验规则
- 偏光片产业链分析报告
评论
0/150
提交评论