From 2cd10d1b75f6857a2c6dbd44eab5d4633ec513ef Mon Sep 17 00:00:00 2001 From: linkaipeng Date: Tue, 8 Aug 2023 12:02:54 +0800 Subject: [PATCH 1/4] Fixing memory leak issue in SentryFlutterPlugin I fixed the memory leak issue in SentryFlutterPlugin by removing the anonymous inner class that was holding a reference to the external SentryFlutterPlugin object, which was causing a memory leak problem with the MethodChannel object. --- .../io/sentry/flutter/SentryFlutterPlugin.kt | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt index 7035671ead..3ebd934479 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt @@ -11,11 +11,13 @@ import io.flutter.plugin.common.MethodChannel import io.flutter.plugin.common.MethodChannel.MethodCallHandler import io.flutter.plugin.common.MethodChannel.Result import io.sentry.Breadcrumb +import io.sentry.DateUtils +import io.sentry.Hint import io.sentry.HubAdapter +import io.sentry.Sentry import io.sentry.SentryEvent import io.sentry.SentryLevel -import io.sentry.Sentry -import io.sentry.DateUtils +import io.sentry.SentryOptions import io.sentry.android.core.ActivityFramesTracker import io.sentry.android.core.AppStartState import io.sentry.android.core.BuildConfig.VERSION_NAME @@ -26,7 +28,6 @@ import io.sentry.protocol.DebugImage import io.sentry.protocol.SdkVersion import io.sentry.protocol.SentryId import io.sentry.protocol.User -import io.sentry.protocol.Geo import java.io.File import java.lang.ref.WeakReference import java.util.Locale @@ -40,10 +41,6 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { private var framesTracker: ActivityFramesTracker? = null private var autoPerformanceTracingEnabled = false - private val flutterSdk = "sentry.dart.flutter" - private val androidSdk = "sentry.java.android.flutter" - private val nativeSdk = "sentry.native.android.flutter" - override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { context = flutterPluginBinding.applicationContext channel = MethodChannel(flutterPluginBinding.binaryMessenger, "sentry_flutter") @@ -183,12 +180,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { options.sdkVersion = sdkVersion options.sentryClientName = "$androidSdk/$VERSION_NAME" options.nativeSdkName = nativeSdk - - options.setBeforeSend { event, _ -> - setEventOriginTag(event) - addPackages(event, options.sdkVersion) - event - } + options.beforeSend = BeforeSendCallbackImpl(options.sdkVersion) args.getIfNotNull("connectionTimeoutMillis") { options.connectionTimeoutMillis = it } args.getIfNotNull("readTimeoutMillis") { options.readTimeoutMillis = it } @@ -216,7 +208,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val appStartTimeMillis = DateUtils.nanosToMillis(appStartTime.nanoTimestamp().toDouble()) val item = mapOf( "appStartTime" to appStartTimeMillis, - "isColdStart" to isColdStart + "isColdStart" to isColdStart, ) result.success(item) } @@ -257,7 +249,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val frames = mapOf( "totalFrames" to total, "slowFrames" to slow, - "frozenFrames" to frozen + "frozenFrames" to frozen, ) result.success(frames) } @@ -408,30 +400,44 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { result.success("") } - private fun setEventOriginTag(event: SentryEvent) { - event.sdk?.let { - when (it.name) { - flutterSdk -> setEventEnvironmentTag(event, "flutter", "dart") - androidSdk -> setEventEnvironmentTag(event, environment = "java") - nativeSdk -> setEventEnvironmentTag(event, environment = "native") - else -> return - } + private class BeforeSendCallbackImpl(private val sdkVersion: SdkVersion?) : SentryOptions.BeforeSendCallback { + override fun execute(event: SentryEvent, hint: Hint): SentryEvent { + setEventOriginTag(event) + addPackages(event, sdkVersion) + return event } } - private fun setEventEnvironmentTag(event: SentryEvent, origin: String = "android", environment: String) { - event.setTag("event.origin", origin) - event.setTag("event.environment", environment) - } - - private fun addPackages(event: SentryEvent, sdk: SdkVersion?) { - event.sdk?.let { - if (it.name == flutterSdk) { - sdk?.packageSet?.forEach { sentryPackage -> - it.addPackage(sentryPackage.name, sentryPackage.version) + companion object { + + private const val flutterSdk = "sentry.dart.flutter" + private const val androidSdk = "sentry.java.android.flutter" + private const val nativeSdk = "sentry.native.android.flutter" + private fun setEventOriginTag(event: SentryEvent) { + event.sdk?.let { + when (it.name) { + flutterSdk -> setEventEnvironmentTag(event, "flutter", "dart") + androidSdk -> setEventEnvironmentTag(event, environment = "java") + nativeSdk -> setEventEnvironmentTag(event, environment = "native") + else -> return } - sdk?.integrationSet?.forEach { integration -> - it.addIntegration(integration) + } + } + + private fun setEventEnvironmentTag(event: SentryEvent, origin: String = "android", environment: String) { + event.setTag("event.origin", origin) + event.setTag("event.environment", environment) + } + + private fun addPackages(event: SentryEvent, sdk: SdkVersion?) { + event.sdk?.let { + if (it.name == flutterSdk) { + sdk?.packageSet?.forEach { sentryPackage -> + it.addPackage(sentryPackage.name, sentryPackage.version) + } + sdk?.integrationSet?.forEach { integration -> + it.addIntegration(integration) + } } } } From 8b830c14861a72bf8a74aab1b45c50258a05ef5b Mon Sep 17 00:00:00 2001 From: linkaipeng Date: Tue, 8 Aug 2023 17:07:22 +0800 Subject: [PATCH 2/4] Update changelog #1588 Update changelog #1588 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1ff7349246..55d814d319 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Changelog +## Unreleased + +### Fixes + +- Fixing memory leak issue in SentryFlutterPlugin (Android Plugin) ([#1588](https://github.com/getsentry/sentry-dart/pull/1588)) + + ## 7.9.0 ### Features From 3d1c8145518ea5468c111cdec66911399f92132a Mon Sep 17 00:00:00 2001 From: linkaipeng Date: Tue, 8 Aug 2023 17:53:53 +0800 Subject: [PATCH 3/4] Fix some lining issues for SentryFlutterPlugin. Fix some lining issues for SentryFlutterPlugin. --- .../io/sentry/flutter/SentryFlutterPlugin.kt | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt index 3ebd934479..cc864f7333 100644 --- a/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt +++ b/flutter/android/src/main/kotlin/io/sentry/flutter/SentryFlutterPlugin.kt @@ -124,9 +124,15 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { args.getIfNotNull("environment") { options.environment = it } args.getIfNotNull("release") { options.release = it } args.getIfNotNull("dist") { options.dist = it } - args.getIfNotNull("enableAutoSessionTracking") { options.isEnableAutoSessionTracking = it } - args.getIfNotNull("autoSessionTrackingIntervalMillis") { options.sessionTrackingIntervalMillis = it } - args.getIfNotNull("anrTimeoutIntervalMillis") { options.anrTimeoutIntervalMillis = it } + args.getIfNotNull("enableAutoSessionTracking") { + options.isEnableAutoSessionTracking = it + } + args.getIfNotNull("autoSessionTrackingIntervalMillis") { + options.sessionTrackingIntervalMillis = it + } + args.getIfNotNull("anrTimeoutIntervalMillis") { + options.anrTimeoutIntervalMillis = it + } args.getIfNotNull("attachThreads") { options.isAttachThreads = it } args.getIfNotNull("attachStacktrace") { options.isAttachStacktrace = it } args.getIfNotNull("enableAutoNativeBreadcrumbs") { @@ -208,7 +214,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val appStartTimeMillis = DateUtils.nanosToMillis(appStartTime.nanoTimestamp().toDouble()) val item = mapOf( "appStartTime" to appStartTimeMillis, - "isColdStart" to isColdStart, + "isColdStart" to isColdStart ) result.success(item) } @@ -249,7 +255,7 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { val frames = mapOf( "totalFrames" to total, "slowFrames" to slow, - "frozenFrames" to frozen, + "frozenFrames" to frozen ) result.success(frames) } @@ -400,7 +406,9 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { result.success("") } - private class BeforeSendCallbackImpl(private val sdkVersion: SdkVersion?) : SentryOptions.BeforeSendCallback { + private class BeforeSendCallbackImpl( + private val sdkVersion: SdkVersion? + ) : SentryOptions.BeforeSendCallback { override fun execute(event: SentryEvent, hint: Hint): SentryEvent { setEventOriginTag(event) addPackages(event, sdkVersion) @@ -424,7 +432,11 @@ class SentryFlutterPlugin : FlutterPlugin, MethodCallHandler, ActivityAware { } } - private fun setEventEnvironmentTag(event: SentryEvent, origin: String = "android", environment: String) { + private fun setEventEnvironmentTag( + event: SentryEvent, + origin: String = "android", + environment: String + ) { event.setTag("event.origin", origin) event.setTag("event.environment", environment) } From 6e46fa1f7f705056fb065b6028ff7f7a21e59d05 Mon Sep 17 00:00:00 2001 From: Manoel Aranda Neto <5731772+marandaneto@users.noreply.github.com> Date: Wed, 9 Aug 2023 10:41:18 +0200 Subject: [PATCH 4/4] Update CHANGELOG.md --- CHANGELOG.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 55d814d319..bfbf30918e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,8 +5,6 @@ ### Fixes - Fixing memory leak issue in SentryFlutterPlugin (Android Plugin) ([#1588](https://github.com/getsentry/sentry-dart/pull/1588)) - - ## 7.9.0 ### Features