如何使用expectWeaklyReachable正确忽略对象

问题描述

第三方 SDK 之一通过保留对两个不同活动的引用导致我的应用程序内存泄漏。我试图用 expectWeaklyReachable 忽略这些泄漏,这是我的设置:

这是我的设置:

val ignoredClasses = listof(
    "com.example.MyLeakingActivity","com.example.MyLeakingActivity2"
)

val watchersToInstall = AppWatcher.appDefaultWatchers(application,object : ReachabilityWatcher {
    override fun expectWeaklyReachable(watchedobject: Any,description: String) {
        if (ignoredClasses.contains(watchedobject::class.java.name)) return
        AppWatcher.objectWatcher.expectWeaklyReachable(watchedobject,description)
    }

})
AppWatcher.manualInstall(
    application = application,watchersToInstall = watchersToInstall
)

问题在于,通过这种配置,LeakMemory 会报告这些活动中所有 Fragment 和 viewmodel 的内存泄漏!! (因为它们的宿主 Activity 还在内存中)。我必须提供可在这些活动中使用的所有 Fragment 和 viewmodel 的非常广泛的忽略列表。

如何设置 LeakCanary 来解决此问题?

解决方法

您可能应该指出并羞辱 3rd 方 SDK,并让他们修复漏洞。

与此同时,一种解决方法可能是:

  • 如果watchedObject 是View 的实例,则调用View.getContext() 并检查它是否是不良活动的实例。
  • 如果watchedObject 是Fragment 的实例,则调用Fragment.getActivity() 并检查它是否是不良活动的实例。