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
- Add exclusion for Samsung's SemClipboardManager Context leak Fixes #740 — committed to square/leakcanary by jrodbx 7 years ago
- Add exclusion for Samsung's SemClipboardManager Context leak Fixes #740 — committed to square/leakcanary by jrodbx 7 years ago
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
Same issue. how can i fix the null exception?
Also here with Samsung S8 - Android 7.0! 😢