栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

leakcanary原理分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leakcanary原理分析

1、无代码集成原理

目前最新版本是2.8.1,看文档从2.0版本集成时就不需要修改任何代码了,只需要在build.gradle里面添加一行引用:

debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.xxxx'
debugImplementation保证了只在debug环境引入,关于初始化,我们在源码中看到在AndroidManifest.xml中配置了一个provider:

    

而在provider中我们可以看到初始化代码:

override fun onCreate(): Boolean {
    val application = context!!.applicationContext as Application
    AppWatcher.manualInstall(application)
    return true
}

通过相关资料可以知道,provider会在application的onCreate调用之前初始化,所以在provider中对leakcanary初始化,跟手动在application中初始化基本一致。

2、内存泄露监控原理

默认只监控Activity、Fragment、RootView、Service类型的泄露,而这些类型对象有类似与声明周期的节点,知道对象需要释放了。在这个节点,例如Activity的onDestroy(),在这个声明周期后,这个对象就需要释放了,此时对此对象进行监控,看5秒后有没有释放,如果没有释放的话,会触发GC后再判断,如果还没有释放,会认为此对象存在内存泄露,leakcanary会手机泄露信息展示出来。

关于怎么监控一个对象有没有释放,是利用了WeakReference的一个特性,就是创建弱引用时指定一个引用队列(ReferenceQueue),当引用的对象被回收,虚拟机会把此弱引用加入到关联的引用队列中。通过ReferenceQueue中的内容,可以判断对象是否被回收。

3、不同对象监控实现

Activity的监控是通过注册声明周期回调,监听activity销毁时,开始对activity开始监控

private val lifecycleCallbacks =
    object : Application.ActivityLifecycleCallbacks by noOpDelegate() {
      override fun onActivityDestroyed(activity: Activity) {
        reachabilityWatcher.expectWeaklyReachable(
          activity, "${activity::class.java.name} received Activity#onDestroy() callback"
        )
      }
    }

  override fun install() {
    application.registerActivityLifecycleCallbacks(lifecycleCallbacks)
  }

Fragment的监控同样是通过注册声明周期回调:

override fun invoke(activity: Activity) {
    val fragmentManager = activity.fragmentManager
    fragmentManager.registerFragmentLifecycleCallbacks(fragmentLifecycleCallbacks, true)
  }

override fun onFragmentDestroyed( fm: FragmentManager, fragment: Fragment) {
      reachabilityWatcher.expectWeaklyReachable(
        fragment, "${fragment::class.java.name} received Fragment#onDestroy() callback")
    }

View是监控onViewDetachedFromWindow()调用:

rootView.addonAttachStateChangeListener(object : onAttachStateChangeListener {

        val watchDetachedView = Runnable {
          reachabilityWatcher.expectWeaklyReachable(
            rootView, "${rootView::class.java.name} received View#onDetachedFromWindow() callback"
          )
        }

        override fun onViewDetachedFromWindow(v: View) {
          mainHandler.post(watchDetachedView)
        }
      })

Android ContentProvider 初始化过程 - 知乎

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/763470.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号