LeakCanary
遵循以下四步去解决内存泄漏:
- 找到内存泄漏踪迹
 - 缩小疑似的引用范围
 - 找到导致泄漏的引用
 - 修复泄漏
 
LeakCanary可以完成前两步
LeakCanary的使用
引入 module/build.gradle中添加以下内容即可
1  | debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.7'  | 
LeakCanary hook了Android生命周期,从而实现了内存泄露的自动检测,当Activity和Fragment被销毁需要被回收的时候,这些销毁的对象被传递给了ObjectWatcher, ObjectWatcher持有这些对象的弱引用,LeakCanary自动检测如下对象是否发生泄露.
- 已经销毁的
Activity实例 - 已经销毁的
Fragment实例 - 已经销毁的小块
View实例 - 已经清空的
ViewModel实例 
- 以├─开头的行代表java对象,
 - 以│ ↓ 开头的行代表指向下一行java对象的引用
 
1  | ┬───  | 
PathClassLoader有一个runtimeInternalObjects属性,这是一个对象数组 这个数组的第43个引用指向了Utils类 ╰→开头的行指向了泄露对象, 这个Utils有一个静态helper指向了一个泄露的对象。
例子
1  | class ExampleApplication : Application() {  | 
1  | LeakCanary提供了如下的泄露路径  | 
来分析这个路径:
这个
FontsContract类是一个系统类,拥有一个sContext静态属性,指向了ExampleApplication对象,这个对象里有一个leakedViews指向了一个ArrayList,里面有个对象引用TextView,里面持有一个Context指向了一个已经destory的activity在
android app中,Application是一个不会被回收的单例,
找到造成此次泄露的引用
根据之前的分析,找到导致此次泄露的引用是因为Application持有了已经销毁的activity中的View