LeakCanary 源码详解(1)

leakcanary-android-sample 使用示例
leakcanary-object-watcher-android 自动注册
leakcanary-object-watcher-android-core 各种Watcher 的实现。
先总体说一下原理,有个大致框架了解,看完后可以回过头再看看这段话:通过监听Activity的onDestory,手动调用GC,然后通过ReferenceQueue+WeakReference(利用weakReference表示弱引用,其实就是包装了一个强引用,GC的时候,这个被包装的强引用能被释放掉。如果有ReferenceQueue的话,在释放的时候就把这个Reference放到ReferenceQueue里面),来判断Activity对象是否被回收,然后结合dump Heap的hpof文件,以前是通过Haha开源库分析泄露的位置,现在是用了shark库,但库的作用是一样的,都是用来解析hprof文件,定位内存泄漏发生的位置。
LeakCanary 是怎么完成自动注册的,不需要添加任何初始化注入代码?
是利用android系统的app的启动流程中先启动contentProvider 然后是Application的oncreate方法。所以注册代码在LeakCanary的一个contentProvider中。
在这里插入图片描述插播一个,如果有人遇到无法运行sample模块的,准确说是提示安装成功,但设备上不显示无任何反应,找不到sample app。
在这里插入图片描述我来回切换这个选项再安装就可以了,切换成nothing 然后再切换回来default apk就可以了
在这里插入图片描述
然后我们再提出一个问题,内存泄露是怎么检测到的?这也是LeakCanary的核心原理了。
在AppWatcher的manalinstall方法中 调用了很多Watcher的install方法,我们看其中的一个ActiivityWatcher ,监测Activity,里面的实现很简单,看图例1 在install方法的时候注入lifeCycleCallback回调,这样就能在activity destory的时候回调ActivityLifecyclerCallbacks的onActivityDestoryed方法,这就到图例2中在这个回调方法中ActivityWatcher 做了什么,调用了 reachabilityWatcher.expectWeaklyReachable方法,

在这里插入图片描述

点进去你会发现是个接口方法
在这里插入图片描述它的实现,正是ObjectWatcher.看它是怎么传递进ActivityWatcher的,会在AppWatcher里面给ActivityWatcher传递参数objectWatcher
在这里插入图片描述我们再看一下,这个对象是什么,是ObjectWatcher。
在这里插入图片描述
看一下这个对象是怎么实现的,画的部分应该就是核心代码了,也是最容易误解的地方,下一篇分析吧
在这里插入图片描述待续。。。
下一篇:LeakCanary源码详解(2)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值