一. 内存泄漏的 Bug 猛增
比来在 App 进行 mokey 测试的时刻检测到一些内存泄漏问题。在前天的测试中,楼主一刹时收到了4个如许的 Bug 单,刹时心理无比纠结,真有切切只羊驼向我奔来。
登录页面出现内存泄漏??!!楼主的代码是如斯的完美而无懈可击,这么可能出现这么多泄漏的问题?
插播什么是 Activity 泄漏:Android 中 Activity 代表一个页面,拥有一段生命周期,生命周期停止后,Activity 对象应当在之后某个合适的机会被 VM 收受接收内存。出现了泄漏就意味着 Activity 生命周期停止后,VM发明 Activity 一向被持有,没有收受接收这些无用的内存。
按照以往的经验,大年夜部分 Activity 泄漏的原因都是因为 Handler 内部类长时光挂在线程中导致的。而这块我们 App 已经推敲便处理了。毕竟是哪泄漏了?
我们再来看看 AuthDialog 的引用链。
带着困惑的心态并且为了证实清白,我一个个点进去看了,总共有三条不合的引用链。为了后续解释,这里取了个名字:
① AuthDialog 引用链
② BrowserFrame 引用链
③ IClipboradDataPaste 引用链
看来此次情况有点不合!因为 Monkey 测试的机型比较少,这里所有的 Bug 都来自一部三星 GT-I9300@android+4.3 手机。
为了快速解决问题,楼主询问了其他同事和 StackOverflow,发明这个中有三个类 CookieSyncManager, WebView, WebViewClassic 已经被很多人提起过,它们会导致内存泄漏!初步有如下的结论如下:
1.CookieSyncManager 是个全局静态单例,操作体系内部应用了 App 的 Activity 作为 Context 构造了它的实例。我们应当在 App 启动的时刻,抢先帮体系创建这个单例,并且要用 applicationContext,让它不会引用到 Activity。
换成 MAT 看会比较清楚:
2.应用 WebView 的页面(Activity),在生命周期停止页面退出(onDestory)的时刻,须要主动调用 WebView.onPause()以及 WebView.destory()以便让体系释放 WebView 相干资本。
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 。
网上已经有很多例子注解,直接用 Activity 作为参数构建 WebView 就异常有可能导致 Activity 泄漏。
不过也看到了代铝闼楝有调用了 WebView 的 destory()办法释放资本。然则这里似乎无法包管 dismiss()必定会被履行。
最终,大年夜家都有了一个初步的共鸣,在 Android4.3 以下的旧版本,应用 Activity 对象创建 WebView,确切有可能导致内存泄漏。异常高兴能获得 SDK 童鞋的大年夜力支撑,一路分析,问题到这里有了初步的进展。
四. 心结未解,翻看WebView源码懂得根源
不过,问题到这里楼主心理照样有个很严重的困惑没有解开(是什么困惑呢?)。于是拿了 Android4.3 的源码又翻了一遍欲望找寻这里头的根来源基本因,做了一点记录,针对 WebView 在 Java 层的构造画了一个不严谨的类图:源率攀来源:http://androidxref.com/4.3_r2.1/ (请复制以上链接到浏览器打开)
推荐阅读
4)始终供给关于异常的有意义的完全的信息异常处理是Java 开辟中的一个重要部分。它是关乎每个应用的一个非功能性需求,是为了处理任何缺点状况,比如资本弗查拜访,不法输入,空输入等等>>>详细阅读
本文标题:Android中导致内存泄漏的竟然是它----Dialog
地址:http://www.17bianji.com/lsqh/35540.html
1/2 1