Skip to content

Commit adf71f4

Browse files
Fix memory leak issue in SentryFlutterPlugin (#1588)
Co-authored-by: Manoel Aranda Neto <[email protected]>
1 parent 07d9b4d commit adf71f4

File tree

2 files changed

+58
-36
lines changed

2 files changed

+58
-36
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## Unreleased
44

5+
### Fixes
6+
7+
- Fixing memory leak issue in SentryFlutterPlugin (Android Plugin) ([#1588](https://github.com/getsentry/sentry-dart/pull/1588))
8+
59
### Dependencies
610

711
- Bump Android SDK from v6.25.2 to v6.28.0 ([#1586](https://github.com/getsentry/sentry-dart/pull/1586))

flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt

Lines changed: 54 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import io.flutter.plugin.common.MethodChannel
1111
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
1212
import io.flutter.plugin.common.MethodChannel.Result
1313
import io.sentry.Breadcrumb
14+
import io.sentry.DateUtils
15+
import io.sentry.Hint
1416
import io.sentry.HubAdapter
17+
import io.sentry.Sentry
1518
import io.sentry.SentryEvent
1619
import io.sentry.SentryLevel
17-
import io.sentry.Sentry
18-
import io.sentry.DateUtils
20+
import io.sentry.SentryOptions
1921
import io.sentry.android.core.ActivityFramesTracker
2022
import io.sentry.android.core.AppStartState
2123
import io.sentry.android.core.BuildConfig.VERSION_NAME
@@ -26,7 +28,6 @@ import io.sentry.protocol.DebugImage
2628
import io.sentry.protocol.SdkVersion
2729
import io.sentry.protocol.SentryId
2830
import io.sentry.protocol.User
29-
import io.sentry.protocol.Geo
3031
import java.io.File
3132
import java.lang.ref.WeakReference
3233
import java.util.Locale
@@ -40,10 +41,6 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
4041
private var framesTracker: ActivityFramesTracker? = null
4142
private var autoPerformanceTracingEnabled = false
4243

43-
private val flutterSdk = "sentry.dart.flutter"
44-
private val androidSdk = "sentry.java.android.flutter"
45-
private val nativeSdk = "sentry.native.android.flutter"
46-
4744
override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
4845
context = flutterPluginBinding.applicationContext
4946
channel = MethodChannel(flutterPluginBinding.binaryMessenger, "sentry_flutter")
@@ -127,9 +124,15 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
127124
args.getIfNotNull<String>("environment") { options.environment = it }
128125
args.getIfNotNull<String>("release") { options.release = it }
129126
args.getIfNotNull<String>("dist") { options.dist = it }
130-
args.getIfNotNull<Boolean>("enableAutoSessionTracking") { options.isEnableAutoSessionTracking = it }
131-
args.getIfNotNull<Long>("autoSessionTrackingIntervalMillis") { options.sessionTrackingIntervalMillis = it }
132-
args.getIfNotNull<Long>("anrTimeoutIntervalMillis") { options.anrTimeoutIntervalMillis = it }
127+
args.getIfNotNull<Boolean>("enableAutoSessionTracking") {
128+
options.isEnableAutoSessionTracking = it
129+
}
130+
args.getIfNotNull<Long>("autoSessionTrackingIntervalMillis") {
131+
options.sessionTrackingIntervalMillis = it
132+
}
133+
args.getIfNotNull<Long>("anrTimeoutIntervalMillis") {
134+
options.anrTimeoutIntervalMillis = it
135+
}
133136
args.getIfNotNull<Boolean>("attachThreads") { options.isAttachThreads = it }
134137
args.getIfNotNull<Boolean>("attachStacktrace") { options.isAttachStacktrace = it }
135138
args.getIfNotNull<Boolean>("enableAutoNativeBreadcrumbs") {
@@ -183,12 +186,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
183186
options.sdkVersion = sdkVersion
184187
options.sentryClientName = "$androidSdk/$VERSION_NAME"
185188
options.nativeSdkName = nativeSdk
186-
187-
options.setBeforeSend { event, _ ->
188-
setEventOriginTag(event)
189-
addPackages(event, options.sdkVersion)
190-
event
191-
}
189+
options.beforeSend = BeforeSendCallbackImpl(options.sdkVersion)
192190

193191
args.getIfNotNull<Int>("connectionTimeoutMillis") { options.connectionTimeoutMillis = it }
194192
args.getIfNotNull<Int>("readTimeoutMillis") { options.readTimeoutMillis = it }
@@ -408,30 +406,50 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware {
408406
result.success("")
409407
}
410408

411-
private fun setEventOriginTag(event: SentryEvent) {
412-
event.sdk?.let {
413-
when (it.name) {
414-
flutterSdk -> setEventEnvironmentTag(event, "flutter", "dart")
415-
androidSdk -> setEventEnvironmentTag(event, environment = "java")
416-
nativeSdk -> setEventEnvironmentTag(event, environment = "native")
417-
else -> return
418-
}
409+
private class BeforeSendCallbackImpl(
410+
private val sdkVersion: SdkVersion?
411+
) : SentryOptions.BeforeSendCallback {
412+
override fun execute(event: SentryEvent, hint: Hint): SentryEvent {
413+
setEventOriginTag(event)
414+
addPackages(event, sdkVersion)
415+
return event
419416
}
420417
}
421418

422-
private fun setEventEnvironmentTag(event: SentryEvent, origin: String = "android", environment: String) {
423-
event.setTag("event.origin", origin)
424-
event.setTag("event.environment", environment)
425-
}
426-
427-
private fun addPackages(event: SentryEvent, sdk: SdkVersion?) {
428-
event.sdk?.let {
429-
if (it.name == flutterSdk) {
430-
sdk?.packageSet?.forEach { sentryPackage ->
431-
it.addPackage(sentryPackage.name, sentryPackage.version)
419+
companion object {
420+
421+
private const val flutterSdk = "sentry.dart.flutter"
422+
private const val androidSdk = "sentry.java.android.flutter"
423+
private const val nativeSdk = "sentry.native.android.flutter"
424+
private fun setEventOriginTag(event: SentryEvent) {
425+
event.sdk?.let {
426+
when (it.name) {
427+
flutterSdk -> setEventEnvironmentTag(event, "flutter", "dart")
428+
androidSdk -> setEventEnvironmentTag(event, environment = "java")
429+
nativeSdk -> setEventEnvironmentTag(event, environment = "native")
430+
else -> return
432431
}
433-
sdk?.integrationSet?.forEach { integration ->
434-
it.addIntegration(integration)
432+
}
433+
}
434+
435+
private fun setEventEnvironmentTag(
436+
event: SentryEvent,
437+
origin: String = "android",
438+
environment: String
439+
) {
440+
event.setTag("event.origin", origin)
441+
event.setTag("event.environment", environment)
442+
}
443+
444+
private fun addPackages(event: SentryEvent, sdk: SdkVersion?) {
445+
event.sdk?.let {
446+
if (it.name == flutterSdk) {
447+
sdk?.packageSet?.forEach { sentryPackage ->
448+
it.addPackage(sentryPackage.name, sentryPackage.version)
449+
}
450+
sdk?.integrationSet?.forEach { integration ->
451+
it.addIntegration(integration)
452+
}
435453
}
436454
}
437455
}

0 commit comments

Comments
 (0)