question-mark
Stuck on an issue?

Lightrun Answers was designed to reduce the constant googling that comes with debugging 3rd party libraries. It collects links to all the places you might be looking at while hunting down a tough bug.

And, if you’re still stuck at the end, we’re happy to hop on a call to see how we can help out.

Memory leak caused by Samsung Clipboard (SemClipboardManager)

See original GitHub issue

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)

Issue Analytics

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

github_iconTop GitHub Comments

5reactions
Jaypeg85commented, Mar 19, 2018

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 }

5reactions
okkescommented, Sep 21, 2017

Same here with s8+ (7.0)

Read more comments on GitHub >

github_iconTop Results From Across the Web

com.samsung.android.content.clipboard ...
1 Answer 1 · 1. Thank you, this has indeed fix the problem with crash on focus, however I now have the memory...
Read more >
Clipboard issues - Samsung Community - 2000876
I can't access the clipboard The only one that works is Gboard but the system clipboard is inaccessible even through settings search Does ......
Read more >
blob - Google Git
You can help by reporting leak traces that seem to be caused ... .reason("SemClipboardManager is held in memory by an anonymous inner class...
Read more >
A Very Powerful Clipboard: Analysis of a Samsung in-the-wild ...
The second vulnerability (CVE-2021-25369) used by the chain is an information leak to leak the address of the task_struct and sys_call_table.
Read more >
Blocking The Main Thread Causes My Instrumentation Tests To Fail
I'm trying to use LeakCanary for finding memory leaks in my Android ... not in list of external Memory leak caused by Samsung...
Read more >

github_iconTop Related Medium Post

No results found

github_iconTop Related StackOverflow Question

No results found

github_iconTroubleshoot Live Code

Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free

github_iconTop Related Reddit Thread

No results found

github_iconTop Related Hackernoon Post

No results found

github_iconTop Related Tweet

No results found

github_iconTop Related Dev.to Post

No results found

github_iconTop Related Hashnode Post

No results found