Memory leak caused by Samsung Clipboard (SemClipboardManager)
See original GitHub issueObserving 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:
- Created 6 years ago
- Reactions:2
- Comments:39 (1 by maintainers)
Top 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 >
Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start Free
Top Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
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)