场景:最新的leakCanary2.8.1:

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.8.1'

原理:首先就是我们在引入最新的依赖包,什么都不用干了,因为他的初始化在清单文件中注册了contentProvider(),把初始化放到了这里面的onCreate()去初始化了,在初始化的过程中,他会用application监听观察对象activity、fragment等对象的生命周期的变化,当执行销毁的生命周期,他就会用对应ActivityWatch--->ObjectWatch来观察你这个销毁的对象,那怎么观察呢?将对象加入到弱引用对象,并把这个弱引用和一个引用队列Queue来绑定(同时把这个弱引用先添加到一个map的观察列表),这样的话当主动Gc的时候,如果没有泄露,就会回收这个activity观察对象,并会把这个弱引用加入到引用队列中去,我们就可以去判断这个引用队列有没有值,有就代表没泄露,否则为queue.poll()取出来为null就泄露了,最后会把这个泄露对象的弱引用添加到一个set集合,叫做retained objects,最终会使用shark库(原来是haha分析库)去查询泄露的地方生成Dump文件,把分析结果发通知给开发者。

通知点击:告知retained objects---点击-->Dumping Heap---自动-->Analyzing heap

如何看这个分析的结果:

上面两个图就是这个泄露对象的引用链关系,最后就是存在泄露的对象LoginActivity,那为什么泄露就得往上去寻找,发现是在Dialog单例中持有了context(即LoginActivity对象),及时走了destory也不会销毁这个对象,因为被GcRoot一直持有。

这是引起内存泄漏的代码:

object LoadingDialog {//内部生成的时候,根据INSTANCE 看起来感觉是静态,因为可以LoadingDialog.show()//其实是伪静态fun show() {}//这种写法才是静态方法@JvmStaticfun show2() {}private var dialog:Dialog?=nullfun show(context: Context) {cancel()dialog = Dialog(context)dialog?.setContentView(R.layout.dialog_loading)dialog?.setCancelable(false)dialog?.setCanceledOnTouchOutside(false)dialog?.show()}fun cancel() {dialog?.dismiss()}}

解决就是,把dialog用完要置为null

fun cancel() {dialog?.dismiss()dialog = null;}

这样leakCanary就不会通知泄露点了。

Android的LeakCanary的原理分析相关推荐

  1. Android手机一键Root原理分析(作者:非虫,文章来自:《黑客防线》2012年7月)

    之前几天都在做Android漏洞分析的项目,万幸发现了这篇文章.废话不多说,上文章! <Android手机一键Root原理分析> (作者:非虫,文章来自:<黑客防线>2012年 ...

  2. Android系统的JNI原理分析(二)- 数据类型转换和方法签名

    声明 前阶段在项目中使用了Android的JNI技术,在此文中做些技术知识总结. 本文参考了一些书籍的若干章节,比如<Android进阶解密-第9章-JNI原理>.<深入理解Andr ...

  3. 事件争夺战 Android事件处理机制与原理分析

    事件争夺战 Android事件处理机制与原理分析 文章目录 事件争夺战 Android事件处理机制与原理分析 View的继承关系 View的事件处理源码 总结: ViewGroup的事件分发源码 总结 ...

  4. Android锁屏机制原理分析

    转载自:http://www.2cto.com/kf/201401/273898.html 春节前最后几天了,工作上几乎没有什么要做.大致整理下之前工作中写的文档,PPT,手册. 由于去年一年完全转到 ...

  5. Android 6.0 JNI原理分析 和 Linux系统调用(syscall)原理

    JNI原理 引言:分析Android源码6.0的过程,一定离不开Java与C/C++代码直接的来回跳转,那么就很有必要掌握JNI,这是链接Java层和Native层的桥梁,本文涉及相关源码: fram ...

  6. Android面试题--HashMap原理分析

    目录 一.序言 二 .HashMap原理分析 二.HashMap和Hashtable区别? 一.序言 作为Android程序员,出去找工作面试,HashMap应该是最常被问到的一种数据类型.那它是怎么 ...

  7. Android热修复技术原理分析

    2015年以来,Android开发领域里对热修复技术的讨论和分享越来越多,同时也出现了一些不同的解决方案,如QQ空间补丁方案.阿里AndFix以 及微信Tinker,它们在原理各有不同,适用场景各异, ...

  8. Android滤镜效果实现及原理分析

    Android在处理图片时,最常使用到的数据结构是位图(Bitmap),它包含了一张图片所有的数据.整个图片都是由点阵和颜色值组成的,所谓点阵就是一个包含像素的矩阵,每一个元素对应着图片的一个像素.而 ...

  9. android去广告实现原理,分析某视频软件加载方案和去广告原理

    分析某视频软件加载方案和去广告原理0x1用到的工具:AndroidKiller eclipse jd-gui Android逆向助手0x2拿到APK后首先想到的是是否有签名验证,因此用逆向助手重新签名 ...

最新文章

  1. hung-yi lee_p3_线性回归
  2. linux环境上c++ boost安装boost_1_67_0.tar
  3. 强类型DataSet中的DBNull的处理
  4. Object.defineProperty方法
  5. 【requests】Python轻松爬取FTP
  6. 内蒙古电力交易对数据中心用电费用的影响分析
  7. C++若不想使用编译器自动生成的函数,就该明确拒绝
  8. 最短编辑距离问题理解
  9. Android模拟器之神奇Genymotion的安装
  10. iap 审核 文档_为什么必须审核文档
  11. 宜人贷CTO段念:透明与面向目标是管理理念的核心
  12. Mootools 1.4 官方网站的API使用说明存在错误
  13. matlab如何动态输出很长的图片,Qt实现长图片的放大缩小以及动态显示
  14. 仿知乎的问答社区PHP系统+支持响应式/打赏功能
  15. MT【352】极值点偏移
  16. 面试官问:浏览器输入 URL 回车之后发生了什么?
  17. Spring 分组验证
  18. 学习也是一种兴趣爱好
  19. MOSFET和IGBT栅极驱动器电路的基本原理的学习(1)
  20. Linux 系列(三)——Redis 分布式集群搭建

热门文章

  1. QGraphicsView QGraphicsScene 增加任意点
  2. 天环校园门户网站的设计
  3. nginx错误:unknown directive “锘? in F:\nginx/conf/nginx.conf:3
  4. 经典网页设计:20个简约风格的电子商务网站
  5. Java期末项目体温监测系统,作业三:高温预警系统项目中的观察者模式解析
  6. SwiftyJSON库的使用和思考
  7. K8S数据采集组件metrics-server安装
  8. 大学计算机(计算机文化基础)练习题
  9. Bigasoft Video Downloader Pro Mac破解教程
  10. 破 AI 天网?马斯克脑机接口实现与猪连接