问题描述
第三方 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()
并检查它是否是不良活动的实例。