LeakCanary檢測內存泄漏.md

一使用步驟

  1. 添加依賴
// 內存泄漏檢測
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4'
  1. 在application中註冊.後面有代碼
  2. 運行項目後會出現圖標如下,如果有泄漏會以列表的形式進行展現;

二注意事項

  1. 由於我們這個項目是有多個moudle,一開始是LeakCanary是配置在commonlib項目下的,項目的application也是在commonlib下applicationLib裏寫入的,這樣發現不行,後來將項目環境切成每個moudle單獨運行,這時我所有配置項都在marketbundle這個裏面配置了,這時發現是可以進行內存檢測了;
# 是否是module環境file://
IS_MODULE=false

  1. 總結教訓:一開始由於配置全部是在commomlib下面的,我app下面的application去繼承commomlib的applicationlib,applicationlib寫了Leakcanary的註冊這時發現是不行的,安裝app後並沒有黃色的Leaks圖標出現,而我自己試驗自己的appDemo是完全可以的,這個時候其實我就應該意識到這個內存泄漏註冊應該是在主app的moudle裏面進行,而我走了很多的彎路,最後一步一步排除過來才完成了配置,總而言之注意2點
  • 在gradle裏面配置的依賴和application必須是在同一個moudle下,並一定是主moudle;(多個modle情況下,一個的話就不存在這種情況)
  • 必須在當前application裏面實現註冊代碼
public class HostApplication extends ApplicationLib {
    //
    private String TAG = HostApplication.class.getSimpleName();
    public RefWatcher refWatcher;

    @Override
    public void onCreate() { //必須在這個方法裏面進行創建和註冊,不要在lib裏面寫一個abstract方法這裏面繼承,不能這樣
        Log.i(TAG, "onCreate");
        super.onCreate();
        refWatcher = setupLeakCanary();
    }

    private RefWatcher setupLeakCanary() {
        JLog.i(TAG, "LeakCanary setupLeakCanary");
        //如果當前的進程是用來給LeakCanary 進行堆分析的則return,否則會執行LeakCanary的install方法。這樣我們就可以使用LeakCanary了,如果檢測到某個Activity 有內存泄露,LeakCanary 就會給出提示。
        if (LeakCanary.isInAnalyzerProcess(this)) {
            JLog.i(TAG, "LeakCanary isInAnalyzerProcess");
            return RefWatcher.DISABLED;
        }
        return LeakCanary.install(this);
    }

    public static RefWatcher getRefWatcher(Context context) {
        HostApplication leakApplication = (HostApplication) context.getApplicationContext();
        return leakApplication.refWatcher;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章