diff --git a/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakEventListener.kt b/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakEventListener.kt new file mode 100644 index 000000000..3eeae988a --- /dev/null +++ b/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakEventListener.kt @@ -0,0 +1,45 @@ +/* + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +package com.facebook.flipper.plugins.leakcanary2 + +import com.facebook.flipper.android.AndroidFlipperClient +import leakcanary.EventListener +import shark.HeapAnalysis +import shark.HeapAnalysisSuccess + +class FlipperLeakEventListener : EventListener { + private val leaks: MutableList = mutableListOf() + + override fun onEvent(event: EventListener.Event) { + if (event is EventListener.Event.HeapAnalysisDone.HeapAnalysisSucceeded) { + val heapAnalysis = event.heapAnalysis + leaks.addAll(heapAnalysis.toLeakList()) + + AndroidFlipperClient.getInstanceIfInitialized()?.let { client -> + (client.getPlugin(LeakCanary2FlipperPlugin.ID) as? LeakCanary2FlipperPlugin)?.reportLeaks( + leaks) + } + } + } + + private fun HeapAnalysis.toLeakList(): List { + return if (this is HeapAnalysisSuccess) { + allLeaks + .mapNotNull { + if (it.leakTraces.isNotEmpty()) { + it.leakTraces[0].toLeak(it.shortDescription) + } else { + null + } + } + .toList() + } else { + emptyList() + } + } +} diff --git a/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakListener.kt b/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakListener.kt index 660edc7e2..ffc2c3df7 100644 --- a/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakListener.kt +++ b/android/plugins/leakcanary2/src/main/java/com/facebook/flipper/plugins/leakcanary2/FlipperLeakListener.kt @@ -13,6 +13,7 @@ import leakcanary.OnHeapAnalyzedListener import shark.HeapAnalysis import shark.HeapAnalysisSuccess +@Deprecated("Use FlipperLeakEventListener add to LeakCanary.config.eventListeners instead") class FlipperLeakListener : OnHeapAnalyzedListener { private val leaks: MutableList = mutableListOf() diff --git a/desktop/plugins/public/leak_canary/docs/setup.mdx b/desktop/plugins/public/leak_canary/docs/setup.mdx index dd9508e00..f4d7d10b2 100644 --- a/desktop/plugins/public/leak_canary/docs/setup.mdx +++ b/desktop/plugins/public/leak_canary/docs/setup.mdx @@ -16,7 +16,7 @@ dependencies { 2. Update your the `onCreate` method in you `Application` to add the LeakCanary2 plugin to Flipper and the Flipper listener to LeakCanary: ```kt -import com.facebook.flipper.plugins.leakcanary2.FlipperLeakListener +import com.facebook.flipper.plugins.leakcanary2.FlipperLeakEventListener import com.facebook.flipper.plugins.leakcanary2.LeakCanary2FlipperPlugin ... @@ -27,9 +27,9 @@ import com.facebook.flipper.plugins.leakcanary2.LeakCanary2FlipperPlugin /* set the flipper listener in leak canary config */ - LeakCanary.config = LeakCanary.config.copy( - onHeapAnalyzedListener = FlipperLeakListener() - ) + LeakCanary.config = LeakCanary.config.run { + copy(eventListeners = eventListeners + FlipperLeakEventListener) + } SoLoader.init(this, false)