1.build.gradle文件下添加以下編譯選項(xiàng)
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'
2.在Application中使用
public class MyApplication extends Application {
public static RefWatcher getRefWatcher(Context context) {
MyApplication application = (MyApplication) context.getApplicationContext();
return application.mRefWatcher;
}
private RefWatcher mRefWatcher;
@Override
public void onCreate() {
super.onCreate();
mRefWatcher = LeakCanary.install(this);
}
}
3.在fragment或activity監(jiān)聽
public abstract class BaseFragment extends Fragment {
@Override public void onDestroy() {
super.onDestroy();
RefWatcher refWatcher = MyApplication.getRefWatcher(getActivity());
refWatcher.watch(this);
}
}
LeakCanary的工作機(jī)制
1.RefWatcher.watch() 創(chuàng)建一個(gè) KeyedWeakReference 到要被監(jiān)控的對(duì)象耕腾。
2.然后在后臺(tái)線程檢查引用是否被清除,如果沒有岭洲,調(diào)用GC提针。
3.如果引用還是未被清除埃疫,把 heap 內(nèi)存 dump 到 APP 對(duì)應(yīng)的文件系統(tǒng)中的一個(gè) .hprof 文件中簇捍。
4.在另外一個(gè)進(jìn)程中的 HeapAnalyzerService 有一個(gè) HeapAnalyzer 使用HAHA 解析這個(gè)文件植阴。
5.得益于唯一的 reference key, HeapAnalyzer 找到 KeyedWeakReference曾我,定位內(nèi)存泄露捧搞。
6.HeapAnalyzer 計(jì)算 到 GC roots 的最短強(qiáng)引用路徑抵卫,并確定是否是泄露狮荔。如果是的話,建立導(dǎo)致泄露的引用鏈介粘。
7.引用鏈傳遞到 APP 進(jìn)程中的 DisplayLeakService殖氏, 并以通知的形式展示出來。