LeakCannary 原理分析

上篇写到 leakcanary 的使用,这篇主要是了解LeakCannary 大概是如何工作的。

1.首先它是如何监听Activity 销毁的?

因为我们知道只有当activity 销毁(onDestroy())的时候,我们才能对这个activity 进行分析查看哪些对象可能存在内存泄漏。

发现了如下代码:

public static RefWatcher install(Application application) {
    return refWatcher(application).listenerServiceClass(DisplayLeakService.class)
        .excludedRefs(AndroidExcludedRefs.createAppDefaults().build())
        .buildAndInstall();
  }
复制代码

buildAndInstall() 中:

 public RefWatcher buildAndInstall() {
       ....
    if (refWatcher != DISABLED) {
      if (watchActivities) {
      //这是观察activity的
        ActivityRefWatcher.install(context, refWatcher);
      }
      if (watchFragments) {
        FragmentRefWatcher.Helper.install(context, refWatcher);
      }
    }
    LeakCanaryInternals.installedRefWatcher = refWatcher;
    return refWatcher;
  }
复制代码
public final class ActivityRefWatcher {
   ....
  public static void install(Context context, RefWatcher refWatcher) {
    Application application = (Application) context.getApplicationContext();
    ActivityRefWatcher activityRefWatcher = new ActivityRefWatcher(application, refWatcher);
    //拿到application,注册activity的生命周期回调
    application.registerActivityLifecycleCallbacks(activityRefWatcher.lifecycleCallbacks);
  }
复制代码

其中这个:lifecycleCallbacks 就是回调监听

private final Application.ActivityLifecycleCallbacks lifecycleCallbacks =
      new ActivityLifecycleCallbacksAdapter() {//监听activity销毁
        @Override public void onActivityDestroyed(Activity activity) {
          refWatcher.watch(activity);
        }
      };
复制代码

那么我们也可以通过application 注册获取activity 的生命周期监听回调,如下是我写的:

public class LifeCircleActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.life_layout);

        final Application application = (Application) getApplicationContext();
        application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
                Log.i("xx","activity is onActivityCreated...");
            }

            @Override
            public void onActivityStarted(Activity activity) {
                Log.i("xx","activity is onActivityStarted...");
            }

            @Override
            public void onActivityResumed(Activity activity) {
                Log.i("xx","activity is onActivityResumed...");
            }

            @Override
            public void onActivityPaused(Activity activity) {
                Log.i("xx","activity is onActivityPaused...");
            }

            @Override
            public void onActivityStopped(Activity activity) {
                Log.i("xx","activity is onActivityStopped...");
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
                Log.i("xx","activity is onActivitySaveInstanceState...");
            }

            @Override
            public void onActivityDestroyed(Activity activity) {

                application.unregisterActivityLifecycleCallbacks(this);
                Log.i("xx","activity is onDestroy...");
            }
        });
}
复制代码

这样我们就可以监听我们当前这个类的生命周期了,可以运行打印日志就知道了。

2.内存泄漏的对象的引用路径

这块使用到了 square 的另一个开源库 haha ,获取当前内存中的heap堆信息的snapshot

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值