leakcanary: Memory leak caused by Samsung Clipboard (SemClipboardManager)

Observing frequent memory leak on Samsung S6 Edge with Android 7.0 involving our activity context and Samsungs’ clipboard manager

D/LeakCanary: In im.example.app.debug:2.22.0:0.
D/LeakCanary: * im.example.app.ui.activities.GroupChatActivity has leaked:
D/LeakCanary: * GC ROOT com.samsung.android.content.clipboard.SemClipboardManager$2.this$0 (anonymous subclass of android.sec.clipboard.IClipboardDataPasteEvent$Stub)
D/LeakCanary: * references com.samsung.android.content.clipboard.SemClipboardManager.mContext
D/LeakCanary: * leaks im.example.app.ui.activities.GroupChatActivity instance
D/LeakCanary: * Retaining: 1.6 MB.
D/LeakCanary: * Reference Key: 48f5a969-d8c4-434f-a4af-e2ff53157ddd
D/LeakCanary: * Device: samsung samsung SM-G925F zeroltexx
D/LeakCanary: * Android Version: 7.0 API: 24 LeakCanary: 1.5 00f37f5
D/LeakCanary: * Durations: watch=5013ms, gc=173ms, heap dump=4561ms, analysis=227966ms
D/LeakCanary: * Details:
D/LeakCanary: * Instance of com.samsung.android.content.clipboard.SemClipboardManager$2
D/LeakCanary: |   static $classOverhead = byte[744]@315280385 (0x12cacc01)
D/LeakCanary: |   this$0 = com.samsung.android.content.clipboard.SemClipboardManager@342092224 (0x1463e9c0)
D/LeakCanary: |   mDescriptor = java.lang.String@314652704 (0x12c13820)
D/LeakCanary: |   mObject = 490498265248
D/LeakCanary: |   mOwner = com.samsung.android.content.clipboard.SemClipboardManager$2@331477952 (0x13c1f3c0)
D/LeakCanary: |   shadow$_klass_ = com.samsung.android.content.clipboard.SemClipboardManager$2
D/LeakCanary: |   shadow$_monitor_ = 0
D/LeakCanary: * Instance of com.samsung.android.content.clipboard.SemClipboardManager
D/LeakCanary: |   static ACTION_REMOVE_CLIP = java.lang.String@314664576 (0x12c16680)
D/LeakCanary: |   static $classOverhead = byte[904]@1980290401 (0x7608d561)
D/LeakCanary: |   static sService = android.sec.clipboard.IClipboardService$Stub$Proxy@314579456 (0x12c01a00)
D/LeakCanary: |   static ACTION_DISMISS_CLIPBOARD = java.lang.String@314731392 (0x12c26b80)
D/LeakCanary: |   static ACTION_CLIPBOARD_CLOSED = java.lang.String@314730960 (0x12c269d0)
D/LeakCanary: |   static EXTRA_DARK_THEME = java.lang.String@314816200 (0x12c3b6c8)
D/LeakCanary: |   static EXTRA_NO_TOAST = java.lang.String@314883872 (0x12c4bf20)
D/LeakCanary: |   static ACTION_CLIPBOARD_OPENED = java.lang.String@314730384 (0x12c26790)
D/LeakCanary: |   static EXTRA_EXTRA_PATH = java.lang.String@314771664 (0x12c308d0)
D/LeakCanary: |   static TAG = java.lang.String@314943520 (0x12c5a820)
D/LeakCanary: |   static EXTRA_PATH = java.lang.String@1867865776 (0x6f555eb0)
D/LeakCanary: |   static EXTRA_TYPE = java.lang.String@1867826880 (0x6f54c6c0)
D/LeakCanary: |   static ACTION_ADD_CLIP = java.lang.String@314663424 (0x12c16200)
D/LeakCanary: |   FAIL_SET_DATA = 1
D/LeakCanary: |   KEY_DATA = java.lang.String@1868267080 (0x6f5b7e48)
D/LeakCanary: |   KEY_FILTER = java.lang.String@1869366096 (0x6f6c4350)
D/LeakCanary: |   PROTECTED_DATA_MAX = 3
D/LeakCanary: |   SUCCESS_AND_SAVE_BITMAP = 2
D/LeakCanary: |   SUCCESS_SET_DATA = 0
D/LeakCanary: |   mClipboardPasteEvent = com.samsung.android.content.clipboard.SemClipboardManager$2@331477952 (0x13c1f3c0)
D/LeakCanary: |   mCocktailBarManager = com.samsung.android.cocktailbar.CocktailBarManager@331477888 (0x13c1f380)
D/LeakCanary: |   mContext = im.example.app.ui.activities.GroupChatActivity@334734848 (0x13f3a600)
D/LeakCanary: |   mHandler = com.samsung.android.content.clipboard.SemClipboardManager$3@331477920 (0x13c1f3a0)
D/LeakCanary: |   mIsFiltered = false
D/LeakCanary: |   mIsMaximumSize = false
D/LeakCanary: |   mOnClipboardEventServiceListener = com.samsung.android.content.clipboard.SemClipboardManager$1@331477984 (0x13c1f3e0)
D/LeakCanary: |   mOnClipboardEventServiceListeners = java.util.ArrayList@331126912 (0x13bc9880)
D/LeakCanary: |   mPasteListener = null
D/LeakCanary: |   mPersonaManager = com.samsung.android.knox.SemPersonaManager@331126888 (0x13bc9868)
D/LeakCanary: |   mRegInterface = null
D/LeakCanary: |   mSetDataHandler = null
D/LeakCanary: |   mTypeId = 0
D/LeakCanary: |   shadow$_klass_ = com.samsung.android.content.clipboard.SemClipboardManager
D/LeakCanary: |   shadow$_monitor_ = 0
D/LeakCanary: * Instance of im.example.app.ui.activities.GroupChatActivity
D/LeakCanary: |   static $change = null
D/LeakCanary: |   static serialVersionUID = 4181920779988445483
D/LeakCanary: |   static $classOverhead = byte[5848]@317517825 (0x12ecf001)
D/LeakCanary: |   static TAG = java.lang.String@314980832 (0x12c639e0)
D/LeakCanary: |   DESCRIPTION_MIN_LENGTH_FOR_POPUP = 50
D/LeakCanary: |   bottomButton = android.support.v7.widget.AppCompatButton@329263104 (0x13a02800)
D/LeakCanary: |   bottomButtonWrapper = android.widget.FrameLayout@328830976 (0x13999000)
D/LeakCanary: |   buttonProgressBar = com.rey.material.widget.ProgressView@329259008 (0x13a01800)
D/LeakCanary: |   chatWrapper = null
D/LeakCanary: |   onlineMembersCount = 1
D/LeakCanary: |   privateView = null
D/LeakCanary: |   adapter = im.example.app.adapters.ChatAdapter@328077664 (0x138e1160)
D/LeakCanary: |   allBottomLoaded = true
D/LeakCanary: |   allTopLoaded = false
D/LeakCanary: |   alreadyLoading = false
D/LeakCanary: |   chatEditor = im.example.app.core.ChatEditor@327850272 (0x138a9920)
D/LeakCanary: |   emojiSkinPopupView = null
D/LeakCanary: |   fromCountedSerial = null
D/LeakCanary: |   headersDecoration = com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersDecoration@328033992 (0x138d66c8)
D/LeakCanary: |   highlightMessage = false
D/LeakCanary: |   inputControls = android.widget.LinearLayout@327639040 (0x13876000)
D/LeakCanary: |   lastSeenCountedSerial = java.lang.Long@335647216 (0x140191f0)
D/LeakCanary: |   lastSeenSerial = java.lang.Long@335647232 (0x14019200)
D/LeakCanary: |   myMessages = false
D/LeakCanary: |   newMessageHeader = im.example.app.adapters.NewMessageHeaderDecoration@328033912 (0x138d6678)
D/LeakCanary: |   resumed = true
D/LeakCanary: |   scrollToNewMessageHeaderOnSync = false
D/LeakCanary: |   storedPositionTopOffset = 0
D/LeakCanary: |   subscribed = true
D/LeakCanary: |   targetSerial = null
D/LeakCanary: |   titleHintShowing = false
D/LeakCanary: |   typingSubscriptions = java.util.HashMap@325263816 (0x136321c8)
D/LeakCanary: |   typingUsers = java.util.HashMap@325263856 (0x136321f0)
D/LeakCanary: |   channel = im.example.app.entity.Channel@320791400 (0x131ee368)
D/LeakCanary: |   goToBottomButton = android.support.v7.widget.AppCompatImageView@327342080 (0x1382d800)
D/LeakCanary: |   imageShowClicked = false
D/LeakCanary: |   lastVisibleLink = java.lang.String@1867494664 (0x6f4fb508)
D/LeakCanary: |   layoutManager = im.example.app.ui.extensions.CustomLinearLayoutManager@329887520 (0x13a9af20)
D/LeakCanary: |   linkPopupView = null
D/LeakCanary: |   membership = im.example.app.entity.Membership@326927480 (0x137c8478)
D/LeakCanary: |   popupWindow = null
D/LeakCanary: |   progressBar = android.widget.ProgressBar@327341056 (0x1382d400)
D/LeakCanary: |   radialPopupWindow = im.example.app.ui.extensions.RadialPopupWindow@318692544 (0x12fedcc0)
D/LeakCanary: |   recyclerView = android.support.v7.widget.RecyclerView@327344128 (0x1382e000)
D/LeakCanary: |   currentSubTitle = android.text.SpannableString@334505344 (0x13f02580)
D/LeakCanary: |   appBarLayout = null
D/LeakCanary: |   bottomNavigationView = null
D/LeakCanary: |   collapsingToolbarLayout = null
D/LeakCanary: |   contentOverlay = android.view.View@334736384 (0x13f3ac00)
D/LeakCanary: |   contentWrapper = android.widget.FrameLayout@326764544 (0x137a0800)
D/LeakCanary: |   coordinatorLayout = null
D/LeakCanary: |   fab = null
D/LeakCanary: |   menuIncrementedId = -1
D/LeakCanary: |   progressBar = android.widget.ProgressBar@326766592 (0x137a1000)
D/LeakCanary: |   rightButton = android.support.v7.widget.AppCompatButton@326765568 (0x137a0c00)
D/LeakCanary: |   subTitleProgressBar = android.widget.ProgressBar@326767616 (0x137a1400)
D/LeakCanary: |   tabLayout = null
D/LeakCanary: |   toolbar = android.support.v7.widget.Toolbar@326433792 (0x1374fc00)
D/LeakCanary: |   toolbarContainer = null
D/LeakCanary: |   toolbarContentWrapper = android.widget.LinearLayout@326429696 (0x1374ec00)
D/LeakCanary: |   toolbarGroupLogo = im.example.app.ui.extensions.GroupAvatarView@326454272 (0x13754c00)
D/LeakCanary: |   toolbarMode = im.example.app.ui.activities.ToolbarActivity$ToolbarMode@320724176 (0x131ddcd0)
D/LeakCanary: |   toolbarSubTitle = android.support.v7.widget.AppCompatTextView@326768640 (0x137a1800)
D/LeakCanary: |   toolbarSubTitleWrapper = android.widget.LinearLayout@326769664 (0x137a1c00)
D/LeakCanary: |   toolbarTitle = android.support.v7.widget.AppCompatTextView@326755328 (0x1379e400)
D/LeakCanary: |   toolbarUserLogo = im.example.app.ui.extensions.UserAvatarView@326610944 (0x1377b000)
D/LeakCanary: |   appLayout = im.example.app.ui.extensions.AppLayout@326382592 (0x13743400)
D/LeakCanary: |   customTabActivityHelper = im.example.app.ui.extensions.customtabs.CustomTabActivityHelper@326213032 (0x13719da8)
D/LeakCanary: |   pendingRunnable = null
D/LeakCanary: |   subscriptions = rx.subscriptions.CompositeSubscription@327019840 (0x137ded40)
D/LeakCanary: |   tracker = com.google.android.gms.analytics.Tracker@315915408 (0x12d47c90)
D/LeakCanary: |   mDelegate = android.support.v7.app.AppCompatDelegateImplN@326663904 (0x13787ee0)
D/LeakCanary: |   mEatKeyUpEvent = false
D/LeakCanary: |   mResources = null
D/LeakCanary: |   mThemeId = 2131361857
D/LeakCanary: |   mCreated = true
D/LeakCanary: |   mFragments = android.support.v4.app.FragmentController@327019872 (0x137ded60)
D/LeakCanary: |   mHandler = android.support.v4.app.FragmentActivity$1@327174496 (0x13804960)
D/LeakCanary: |   mNextCandidateRequestIndex = 0
D/LeakCanary: |   mOptionsMenuInvalidated = false
D/LeakCanary: |   mPendingFragmentActivityResults = android.support.v4.util.SparseArrayCompat@326213080 (0x13719dd8)
D/LeakCanary: |   mReallyStopped = true
D/LeakCanary: |   mRequestedPermissionsFromFragment = false
D/LeakCanary: |   mResumed = false
D/LeakCanary: |   mRetaining = false
D/LeakCanary: |   mStopped = true
D/LeakCanary: |   mStartedActivityFromFragment = false
D/LeakCanary: |   mStartedIntentSenderFromFragment = false
D/LeakCanary: |   mExtraDataMap = android.support.v4.util.SimpleArrayMap@326195784 (0x13715a48)
D/LeakCanary: |   mActionBar = null
D/LeakCanary: |   mActionModeTypeStarting = 0
D/LeakCanary: |   mActivityInfo = android.content.pm.ActivityInfo@314596800 (0x12c05dc0)
D/LeakCanary: |   mActivityTransitionState = android.app.ActivityTransitionState@327159416 (0x13800e78)
D/LeakCanary: |   mAppLockCheckRunnable = android.app.Activity$1@327019904 (0x137ded80)
D/LeakCanary: |   mAppLockIsInMultiWindowMode = false
D/LeakCanary: |   mApplication = im.example.app.App@315620224 (0x12cffb80)
D/LeakCanary: |   mCalled = true
D/LeakCanary: |   mChangeCanvasToTranslucent = false
D/LeakCanary: |   mChangingConfigurations = false
D/LeakCanary: |   mComponent = android.content.ComponentName@327217136 (0x1380eff0)
D/LeakCanary: |   mConfigChangeFlags = 0
D/LeakCanary: |   mCurrentConfig = android.content.res.Configuration@326688648 (0x1378df88)
D/LeakCanary: |   mDecor = null
D/LeakCanary: |   mDefaultKeyMode = 0
D/LeakCanary: |   mDefaultKeySsb = null
D/LeakCanary: |   mDestroyed = true
D/LeakCanary: |   mDoReportFullyDrawn = false
D/LeakCanary: |   mEatKeyUpEvent = false
D/LeakCanary: |   mEmbeddedID = null
D/LeakCanary: |   mEnableDefaultActionBarUp = true
D/LeakCanary: |   mEnterTransitionListener = android.app.SharedElementCallback$1@1875119720 (0x6fc40e68)
D/LeakCanary: |   mExitTransitionListener = android.app.SharedElementCallback$1@1875119720 (0x6fc40e68)
D/LeakCanary: |   mFinished = true
D/LeakCanary: |   mFlipfont = 0
D/LeakCanary: |   mFragments = android.app.FragmentController@327019936 (0x137deda0)
D/LeakCanary: |   mHandler = android.os.Handler@327174592 (0x138049c0)
D/LeakCanary: |   mHasCurrentPermissionsRequest = false
D/LeakCanary: |   mIdent = 179641163
D/LeakCanary: |   mInstanceTracker = android.os.StrictMode$InstanceTracker@327019920 (0x137ded90)
D/LeakCanary: |   mInstrumentation = android.app.Instrumentation@320684888 (0x131d4358)
D/LeakCanary: |   mIntent = android.content.Intent@327098304 (0x137f1fc0)
D/LeakCanary: |   mLastNonConfigurationInstances = null
D/LeakCanary: |   mMainThread = android.app.ActivityThread@314589536 (0x12c04160)
D/LeakCanary: |   mManagedCursors = java.util.ArrayList@326195808 (0x13715a60)
D/LeakCanary: |   mManagedDialogs = null
D/LeakCanary: |   mMenuInflater = null
D/LeakCanary: |   mParent = null
D/LeakCanary: |   mPolicyManager = null
D/LeakCanary: |   mReferrer = java.lang.String@327035864 (0x137e2bd8)
D/LeakCanary: |   mResultCode = 0
D/LeakCanary: |   mResultData = null
D/LeakCanary: |   mResumed = false
D/LeakCanary: |   mScreenChangeListener = null
D/LeakCanary: |   mSearchEvent = null
D/LeakCanary: |   mSearchManager = null
D/LeakCanary: |   mStartedActivity = false
D/LeakCanary: |   mStopped = true
D/LeakCanary: |   mTaskDescription = android.app.ActivityManager$TaskDescription@327174528 (0x13804980)
D/LeakCanary: |   mTemporaryPause = false
D/LeakCanary: |   mTitle = java.lang.String@315619600 (0x12cff910)
D/LeakCanary: |   mTitleColor = 0
D/LeakCanary: |   mTitleReady = true
D/LeakCanary: |   mToken = android.os.BinderProxy@327278528 (0x1381dfc0)
D/LeakCanary: |   mTranslucentCallback = null
D/LeakCanary: |   mUiThread = java.lang.Thread@1980197944 (0x76076c38)
D/LeakCanary: |   mVisibleBehind = false
D/LeakCanary: |   mVisibleFromClient = true
D/LeakCanary: |   mVisibleFromServer = true
D/LeakCanary: |   mVoiceInteractor = null
D/LeakCanary: |   mWindow = com.android.internal.policy.PhoneWindow@331357472 (0x13c01d20)
D/LeakCanary: |   mWindowAdded = true
D/LeakCanary: |   mWindowManager = android.view.WindowManagerImpl@326213560 (0x13719fb8)
D/LeakCanary: |   mInflater = com.android.internal.policy.PhoneLayoutInflater@327645888 (0x13877ac0)
D/LeakCanary: |   mOverrideConfiguration = null
D/LeakCanary: |   mResources = android.content.res.Resources@326101824 (0x136feb40)
D/LeakCanary: |   mTheme = android.content.res.Resources$Theme@327019616 (0x137dec60)
D/LeakCanary: |   mThemeResource = 2131361857
D/LeakCanary: |   mBase = android.app.ContextImpl@329077248 (0x139d5200)
D/LeakCanary: |   shadow$_klass_ = im.example.app.ui.activities.GroupChatActivity
D/LeakCanary: |   shadow$_monitor_ = 1073746630
D/LeakCanary: * Excluded Refs:
D/LeakCanary: | Field: android.view.Choreographer$FrameDisplayEventReceiver.mMessageQueue (always)
D/LeakCanary: | Thread:FinalizerWatchdogDaemon (always)
D/LeakCanary: | Thread:main (always)
D/LeakCanary: | Thread:LeakCanary-Heap-Dump (always)
D/LeakCanary: | Class:java.lang.ref.WeakReference (always)
D/LeakCanary: | Class:java.lang.ref.SoftReference (always)
D/LeakCanary: | Class:java.lang.ref.PhantomReference (always)
D/LeakCanary: | Class:java.lang.ref.Finalizer (always)
D/LeakCanary: | Class:java.lang.ref.FinalizerReference (always)

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Reactions: 2
  • Comments: 39 (1 by maintainers)

Commits related to this issue

Most upvoted comments

Sorry for opening an old issue, but I’ve had success in fixing this with the following code in onDestroy in your activities or in a onDestroy in Application.ActivityLifecycleCallbacks:

try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Build.MANUFACTURER.equals("samsung")) { Object systemService = getSystemService(Class.forName("com.samsung.android.content.clipboard.SemClipboardManager")); Field mContext = systemService.getClass().getDeclaredField("mContext"); mContext.setAccessible(true); mContext.set(systemService, null); } } catch (ClassNotFoundException | NoSuchFieldException | IllegalAccessException e) { //ignored }

Same here with s8+ (7.0)

Does anybody know if this was already reported to Samsung?

SemEmergencyManager leaking aswell in my app (Galaxy S6). Updated to Nougat last night

There has to be no fix for this it seems. I happen to use this code mentioned by @Jaypeg85 it worked for some Activities but gave below error for Another Activity. Error log is posted here.

I looked at SemClipboardManager class here but I dont seem to understand why mContext is null.

2018-10-11 10:58:43.200 24077-24077/plante.com.cobalt.mobileaccess E/AndroidRuntime: FATAL EXCEPTION: main
Process: plante.com.cobalt.mobileaccess, PID: 24077
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getOpPackageName()' on a null object reference
    at com.samsung.android.content.clipboard.SemClipboardManager.registerClipboardEventListener(SemClipboardManager.java:625)
    at android.widget.EditText.dispatchWindowFocusChanged(EditText.java:272)

On a particular activity, SemClipboardManager leaks 32MBs.

Device is galaxy s5 Neo API 24

Same issue. how can i fix the null exception?

Also here with Samsung S8 - Android 7.0! 😢