android webview 内存泄漏,Android中导致内存泄漏的竟然是它----Dialog

一. 内存泄漏的 Bug 猛增

比来在 App 进行 mokey 测试的时刻检测到一些内存泄漏问题。在前天的测试中,楼主一刹时收到了4个如许的 Bug 单,刹时心理无比纠结,真有切切只羊驼向我奔来。

0f47fce5617b3522600edcc198878053.jpg-wh_651x-s_2640325945.jpg

登录页面出现内存泄漏??!!楼主的代码是如斯的完美而无懈可击,这么可能出现这么多泄漏的问题?

插播什么是 Activity 泄漏:Android 中 Activity 代表一个页面,拥有一段生命周期,生命周期停止后,Activity 对象应当在之后某个合适的机会被 VM 收受接收内存。出现了泄漏就意味着 Activity 生命周期停止后,VM发明 Activity 一向被持有,没有收受接收这些无用的内存。

abd950276b2de308a025a1b1d34c338f.png

按照以往的经验,大年夜部分 Activity 泄漏的原因都是因为 Handler 内部类长时光挂在线程中导致的。而这块我们 App 已经推敲便处理了。毕竟是哪泄漏了?

我们再来看看 AuthDialog 的引用链。

带着困惑的心态并且为了证实清白,我一个个点进去看了,总共有三条不合的引用链。为了后续解释,这里取了个名字:

① AuthDialog 引用链

9708143bb38b47f4bbccf4834e86920c.png

② BrowserFrame 引用链

③ IClipboradDataPaste 引用链

365815e432671a0705387a5db769a079.png

看来此次情况有点不合!因为 Monkey 测试的机型比较少,这里所有的 Bug 都来自一部三星 GT-I9300@android+4.3 手机。

为了快速解决问题,楼主询问了其他同事和 StackOverflow,发明这个中有三个类 CookieSyncManager, WebView, WebViewClassic 已经被很多人提起过,它们会导致内存泄漏!初步有如下的结论如下:

1.CookieSyncManager 是个全局静态单例,操作体系内部应用了 App 的 Activity 作为 Context 构造了它的实例。我们应当在 App 启动的时刻,抢先帮体系创建这个单例,并且要用 applicationContext,让它不会引用到 Activity。

b5ec26ddb2b179ee9c8eb76edaf4dafb.png

换成 MAT 看会比较清楚:

2.应用 WebView 的页面(Activity),在生命周期停止页面退出(onDestory)的时刻,须要主动调用 WebView.onPause()以及 WebView.destory()以便让体系释放 WebView 相干资本。

1f54788635874780b135de0dd35e27f4.png

4.WebView 内存泄漏是众所周知的,建议别的启动一个过程专门运行 WebView。不要9998,不要9999,我们要100%!WebView 用完之后就把过程杀逝世,即使泄漏了也无碍。

按照以上的各种结论,我们都认定了这琅绫擎就是 WebView 引起的。

然则!我们的应用主过程 LoginActivity 根本没有效到 WebView 啊!!!

三. 第三方 jar 包应用 WebView 这可若何是好

根据以上的 AuthDialog 引用链,楼主把目标锁定了某sdk:

问题到这里发明比较麻烦了棘SDK 对我们来说是第三方包,我们没法让第三方包不消 WebView,或者让第三方包把 WebView 放在别的一个过程中运行啊!于是,在 App 膳绫擎做规避临时不好实现。于是找了 SDK 的童鞋一路分析了。

翻了一阵子恶心的混淆后的代码,找到下面这么一段。SDK 确切创建了 WebView 实例,并且用的是客户法度榜样的 Activity 对象作为 WebView 的 Context 如下:

c 跟 j 都是 SDK 中持续于 WebView 的一个子类,k 是登录接口的输入参数 Activity。这里创建了 c 对象之后向上塑形赋给了 j 。

a52ef717f6270cf19167e43a939d9d34.png

网上已经有很多例子注解,直接用 Activity 作为参数构建 WebView 就异常有可能导致 Activity 泄漏。

6c68f2e09d343101ba584f0fecff88b7.png

不过也看到了代铝闼楝有调用了 WebView 的 destory()办法释放资本。然则这里似乎无法包管 dismiss()必定会被履行。

aa769341326532e19fddc6abf56512c4.png

最终,大年夜家都有了一个初步的共鸣,在 Android4.3 以下的旧版本,应用 Activity 对象创建 WebView,确切有可能导致内存泄漏。异常高兴能获得 SDK 童鞋的大年夜力支撑,一路分析,问题到这里有了初步的进展。

四. 心结未解,翻看WebView源码懂得根源

不过,问题到这里楼主心理照样有个很严重的困惑没有解开(是什么困惑呢?)。于是拿了 Android4.3 的源码又翻了一遍欲望找寻这里头的根来源基本因,做了一点记录,针对 WebView 在 Java 层的构造画了一个不严谨的类图:源率攀来源:http://androidxref.com/4.3_r2.1/ (请复制以上链接到浏览器打开)

748a27dd461bd879999c64326685804e.png

推荐阅读

4)始终供给关于异常的有意义的完全的信息异常处理是Java 开辟中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何缺点状况,比如资本弗查拜访,不法输入,空输入等等>>>详细阅读

地址:http://www.17bianji.com/lsqh/35540.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值