square / leakcanary

A memory leak detection library for Android.
https://square.github.io/leakcanary
Apache License 2.0
29.41k stars 3.97k forks source link

WebView Context Leak #92

Closed imallan closed 8 years ago

imallan commented 9 years ago

I'm not sure this is the proper place to post this, but I've done plenty of research, the only way to prevent this is start WebViewActivity with another process and kill it inside onDestroy. But this method has its own disadvantages.

The leak happens everytime on all my devices running 5.0+, haven't checked with 4.X

In com.example.webviewmemoryleaktest:1.0:1.
* com.example.webviewmemoryleaktest.WebViewActivity has leaked:
* GC ROOT android.os.ResultReceiver$MyResultReceiver.this$0
* references org.chromium.content.browser.ContentViewCore$2$1.this$1 (anonymous class extends android.os.ResultReceiver)
* references org.chromium.content.browser.ContentViewCore$2.this$0
* references org.chromium.content.browser.ContentViewCore.mContext
* references com.android.webview.chromium.ResourcesContextWrapperFactory$WebViewContextWrapper.mBase
* leaks com.example.webviewmemoryleaktest.WebViewActivity instance

* Reference Key: 9a0346cf-6ad9-4b07-9329-a975d8fa3cbe
* Device: LGE google Nexus 4 occam
* Android Version: 5.1 API: 22
* Durations: watch=5139ms, gc=188ms, heap dump=2822ms, analysis=30918ms

Appreciate if anyone could help. Thanks!

pyricau commented 9 years ago

See the steps here: https://github.com/square/leakcanary#my-leak-is-caused-by-the-android-sdk-implementation

imallan commented 9 years ago

@pyricau Sorry for posting in the wrong place. Will create a StackOverFlow question instead. Thanks a lot.

pyricau commented 9 years ago

I wasn't referring to SO, but rather to these steps:

  1. Provide the entire leak trace information (reference key, device, etc).
  2. Read the AOSP source for that version of Android, and try to figure out why it happens. You can easily navigate through SDK versions android/platform_frameworks_base.
  3. Check if it happens on the latest version of Android, and otherwise use blame to find when it was fixed.
  4. If it's still happening, build a simple repro case
  5. File an issue on b.android.com with the leak trace and the repro case
  6. Create a PR in LeakCanary to update AndroidExcludedRefs.java. Optional: if you find a hack to clear that leak on previous versions of Android, feel free to document it.
pyricau commented 9 years ago

I need more info, ie a heap dump or at least the output from 1.3.1 which is more detailed. Please reopen if you're able to provide those.

koujm commented 9 years ago

Issue is tracked here https://code.google.com/p/chromium/issues/detail?id=473146

pyricau commented 9 years ago

Don't think this was specifically it, there's no weak hash map involved here.

meoyawn commented 9 years ago

same thing happens on 4.4.4 but with a slightly different leak trace

In com.zasosalo.android:1.0.0:3.
* com.zasosalo.android.LoginActivity has leaked:
* GC ROOT android.os.ResultReceiver$MyResultReceiver.this$0
* references com.android.org.chromium.content.browser.ContentViewCore$3$1.this$1 (anonymous class extends android.os.ResultReceiver)
* references com.android.org.chromium.content.browser.ContentViewCore$3.this$0 (anonymous class implements com.android.org.chromium.content.browser.input.ImeAdapter$ImeAdapterDelegate)
* references com.android.org.chromium.content.browser.ContentViewCore.mContext
* leaks com.zasosalo.android.LoginActivity instance
[ 05-23 15:59:45.609  5981: 6343 D/LeakCanary ]
    * Reference Key: 5c57d016-072b-4562-85c9-8fb7f1e76af0
* Device: Genymotion generic Google Nexus 4 - 4.4.4 - API 19 - 768x1280 vbox86p
* Android Version: 4.4.4 API: 19 LeakCanary: 1.3.1
* Durations: watch=5603ms, gc=107ms, heap dump=203ms, analysis=2624ms
[ 05-23 15:59:45.609  5981: 6343 D/LeakCanary ]
    * Details:
* Instance of android.os.ResultReceiver$MyResultReceiver
|   this$0 = com.android.org.chromium.content.browser.ContentViewCore$3$1 [id=0xa503ffb8]
|   mDescriptor = java.lang.String [id=0xa509e868]
|   mOwner = android.os.ResultReceiver$MyResultReceiver [id=0xa503fff8]
|   mObject = -1206109480
* Instance of com.android.org.chromium.content.browser.ContentViewCore$3$1
|   this$1 = com.android.org.chromium.content.browser.ContentViewCore$3 [id=0xa5063260]
|   mHandler = android.os.Handler [id=0xa503ffd8]
|   mReceiver = android.os.ResultReceiver$MyResultReceiver [id=0xa503fff8]
|   mLocal = true
* Instance of com.android.org.chromium.content.browser.ContentViewCore$3
|   this$0 = com.android.org.chromium.content.browser.ContentViewCore [id=0xa5055f70]
* Instance of com.android.org.chromium.content.browser.ContentViewCore
|   static $staticOverhead = byte[] [id=0xa4ea3f89;length=24;size=40]
|   static $assertionsDisabled = true
|   mAccessibilityInjector = com.android.org.chromium.content.browser.accessibility.JellyBeanAccessibilityInjector [id=0xa507dd38]
|   mAccessibilityManager = android.view.accessibility.AccessibilityManager [id=0xa506e828]
|   mAccessibilityScriptInjectionObserver = null
|   mActionMode = null
|   mAdapterInputConnectionFactory = com.android.org.chromium.content.browser.input.ImeAdapter$AdapterInputConnectionFactory [id=0xa5091b20]
|   mBrowserAccessibilityManager = null
|   mContainerView = android.webkit.WebView [id=0xa50af768]
|   mContainerViewInternals = com.android.webview.chromium.WebViewChromium$InternalAccessAdapter [id=0xa50be2a0]
|   mContentSettings = com.android.org.chromium.content.browser.ContentSettings [id=0xa5043c98]
|   mContentViewClient = com.android.org.chromium.android_webview.AwContentViewClient [id=0xa50be5e0]
|   mContentViewGestureHandler = com.android.org.chromium.content.browser.ContentViewGestureHandler [id=0xa50af628]
|   mContext = com.zasosalo.android.LoginActivity [id=0xa5062d80]
|   mDeferredHandleFadeInRunnable = null
|   mZoomManager = com.android.org.chromium.content.browser.ZoomManager [id=0xa50962d0]
|   mDownloadDelegate = null
|   mEndHandlePoint = com.android.org.chromium.content.browser.RenderCoordinates$NormalizedPoint [id=0xa508bf30]
|   mFakeMouseMoveRunnable = null
|   mFocusPreOSKViewportRect = android.graphics.Rect [id=0xa5074158]
|   mGestureStateListener = com.android.org.chromium.android_webview.AwContents$AwGestureStateListener [id=0xa504c258]
|   mZoomControlsDelegate = com.android.org.chromium.android_webview.AwZoomControls [id=0xa50be9d0]
|   mWebContentsObserver = com.android.org.chromium.content.browser.ContentViewCore$6 [id=0xa5062348]
|   mImeAdapter = com.android.org.chromium.content.browser.input.ImeAdapter [id=0xa5081dc8]
|   mWebContents = com.android.org.chromium.content.browser.webcontents.WebContentsImpl [id=0xa5044750]
|   mInputConnection = com.android.org.chromium.content.browser.input.AdapterInputConnection [id=0xa51ec9d0]
|   mInsertionHandleController = com.android.org.chromium.content.browser.ContentViewCore$14 [id=0xa5040520]
|   mInsertionHandlePoint = com.android.org.chromium.content.browser.RenderCoordinates$NormalizedPoint [id=0xa5089590]
|   mJavaScriptInterfaces = java.util.HashMap [id=0xa50930e0]
|   mLastSelectedText = null
|   mViewAndroid = com.android.org.chromium.ui.base.ViewAndroid [id=0xa5096380]
|   mVSyncProvider = null
|   mVSyncListener = null
|   mStartHandlePoint = com.android.org.chromium.content.browser.RenderCoordinates$NormalizedPoint [id=0xa508c540]
|   mSmartClipDataListener = null
|   mSelectionHandleController = null
|   mRetainedJavaScriptObjects = java.util.HashSet [id=0xa5049f00]
|   mRenderCoordinates = com.android.org.chromium.content.browser.RenderCoordinates [id=0xa508b9b0]
|   mPositionObserver = com.android.org.chromium.content.browser.ViewPositionObserver [id=0xa504d570]
|   mPositionListener = com.android.org.chromium.content.browser.ContentViewCore$4 [id=0xa5081528]
|   mPopupZoomer = com.android.org.chromium.content.browser.PopupZoomer [id=0xa5053ef8]
|   mPhysicalBackingWidthPix = 768
|   mNativeContentViewCore = -1209442408
|   mPendingRendererFrame = true
|   mRequestedVSyncForInput = true
|   mOverdrawBottomHeightPix = 0
|   mScrolledAndZoomedFocusedEditableNode = false
|   mSelectionEditable = false
|   mNeedAnimate = false
|   mPhysicalBackingHeightPix = 1022
|   mNativeAccessibilityEnabled = false
|   mUnfocusOnNextSizeChanged = false
|   mUnselectAllOnActionModeDismiss = false
|   mNativeAccessibilityAllowed = false
|   mVSyncListenerRegistered = false
|   mLocationInWindowY = 0
|   mVSyncSubscriberCount = 1
|   mLocationInWindowX = 0
|   mViewportHeightPix = 1022
|   mViewportSizeOffsetHeightPix = 0
|   mViewportSizeOffsetWidthPix = 0
|   mViewportWidthPix = 768
|   mInForeground = true
|   mHasSelection = false
|   mHardwareAccelerated = true
|   mDidSignalVSyncUsingInputEvent = false
* Instance of com.zasosalo.android.LoginActivity
|   h = com.zasosalo.android.holdr.Holdr_Login [id=0xa50baa10]
|   softKeyboardLazy = dagger.internal.LazyBinding$1 [id=0xa507a168]
|   vkAuthLazy = dagger.internal.LazyBinding$1 [id=0xa507a150]
|   self = com.zasosalo.android.LoginActivity [id=0xa5062d80]
|   mDelegate = android.support.v7.app.AppCompatDelegateImplV11 [id=0xa5051190]
|   mAllLoaderManagers = android.support.v4.util.SimpleArrayMap [id=0xa504fc60]
|   mLoaderManager = null
|   mContainer = android.support.v4.app.FragmentActivity$2 [id=0xa506d0b8]
|   mHandler = android.support.v4.app.FragmentActivity$1 [id=0xa506d028]
|   mFragments = android.support.v4.app.FragmentManagerImpl [id=0xa506d050]
|   mCreated = true
|   mCheckedForLoaderManager = true
|   mLoadersStarted = false
|   mOptionsMenuInvalidated = false
|   mReallyStopped = true
|   mResumed = false
|   mRetaining = false
|   mStopped = true
|   mActionBar = null
|   mActivityInfo = android.content.pm.ActivityInfo [id=0xa5059930]
|   mAllLoaderManagers = android.util.ArrayMap [id=0xa5090458]
|   mApplication = com.zasosalo.android.DebugApp [id=0xa504b670]
|   mWindowManager = android.view.WindowManagerImpl [id=0xa50510f8]
|   mWindow = com.android.internal.policy.impl.PhoneWindow [id=0xa5070490]
|   mUiThread = java.lang.Thread [id=0xa4d4abd8]
|   mTranslucentCallback = null
|   mComponent = android.content.ComponentName [id=0xa507f6a8]
|   mToken = android.os.BinderProxy [id=0xa507f738]
|   mContainer = android.app.Activity$1 [id=0xa5062f38]
|   mCurrentConfig = android.content.res.Configuration [id=0xa5070408]
|   mDecor = null
|   mTitle = java.lang.String [id=0xa50807c0]
|   mDefaultKeySsb = null
|   mSearchManager = null
|   mResultData = null
|   mEmbeddedID = null
|   mParent = null
|   mMenuInflater = null
|   mFragments = android.app.FragmentManagerImpl [id=0xa5062ec0]
|   mHandler = android.os.Handler [id=0xa506d008]
|   mManagedDialogs = null
|   mInstanceTracker = android.os.StrictMode$InstanceTracker [id=0xa5062f60]
|   mInstrumentation = android.app.Instrumentation [id=0xa5049e60]
|   mIntent = android.content.Intent [id=0xa507f618]
|   mLastNonConfigurationInstances = null
|   mLoaderManager = null
|   mManagedCursors = java.util.ArrayList [id=0xa5062f48]
|   mMainThread = android.app.ActivityThread [id=0xa50451d0]
|   mLoadersStarted = false
|   mIdent = 1386585952
|   mFinished = true
|   mEnableDefaultActionBarUp = false
|   mResultCode = 0
|   mDoReportFullyDrawn = false
|   mResumed = false
|   mDestroyed = true
|   mStartedActivity = false
|   mStopped = true
|   mTemporaryPause = false
|   mDefaultKeyMode = 0
|   mTitleColor = 0
|   mTitleReady = true
|   mConfigChangeFlags = 0
|   mCheckedForLoaderManager = true
|   mChangingConfigurations = false
|   mVisibleFromClient = true
|   mVisibleFromServer = true
|   mChangeCanvasToTranslucent = false
|   mWindowAdded = true
|   mCalled = true
|   mBase = android.app.ContextImpl [id=0xa506d0c8]
|   mInflater = com.android.internal.policy.impl.PhoneLayoutInflater [id=0xa5050e68]
|   mOverrideConfiguration = null
|   mResources = android.content.res.Resources [id=0xa5048628]
|   mTheme = android.content.res.Resources$Theme [id=0xa5051110]
|   mThemeResource = 2131230832
|   mBase = android.app.ContextImpl [id=0xa506d0c8]
meoyawn commented 9 years ago

really hard to say why it happens, has something to do to a handler at line 604 https://android.googlesource.com/platform/external/chromium_org/+/eb7b227/content/public/android/java/src/org/chromium/content/browser/ContentViewCore.java or maybe the way the runnable is posted on line 57 https://android.googlesource.com/platform/frameworks/base.git/+/android-5.1.1_r1/core/java/android/os/ResultReceiver.java I need help

fourlastor commented 9 years ago

I think it's ResultReceiver. I'm having a similar issue with a transition:

* fm.pause.article_detail.ArticleDetailActivity has leaked:
* GC ROOT android.os.ResultReceiver$MyResultReceiver.this$0
* references android.app.ExitTransitionCoordinator.mWindow
* references com.android.internal.policy.impl.PhoneWindow.mEnterTransition
* references android.transition.Fade.mCurrentAnimators
* references java.util.ArrayList.array
* references array java.lang.Object[].[0]
* references android.animation.ObjectAnimator.mListeners
* references java.util.ArrayList.array
* references array java.lang.Object[].[1]
* references android.transition.Visibility$2.this$0 (anonymous class extends android.animation.AnimatorListenerAdapter)
* references android.transition.Fade.mParent
* references android.transition.TransitionSet.mListeners
* references java.util.ArrayList.array
* references array java.lang.Object[].[1]
* references android.transition.TransitionManager$MultiListener$1.val$runningTransitions (anonymous class extends android.transition.Transition$TransitionListenerAdapter)
* references android.util.ArrayMap.mArray
* references array java.lang.Object[].[4]
* references com.android.internal.policy.impl.PhoneWindow$DecorView.mContext
* leaks fm.pause.article_detail.ArticleDetailActivity instance

* Reference Key: 7ea23c6b-2837-45be-8a66-9e1c3ba83f49
* Device: LGE google Nexus 5 hammerhead
* Android Version: 5.1.1 API: 22 LeakCanary: 1.3.1
* Durations: watch=5100ms, gc=199ms, heap dump=3402ms, analysis=21642ms

* Details:
* Instance of android.os.ResultReceiver$MyResultReceiver
|   this$0 = android.app.ExitTransitionCoordinator [id=0x33bef220]
|   mDescriptor = java.lang.String [id=0x70ab5060]
|   mObject = -1618273480
|   mOwner = android.os.ResultReceiver$MyResultReceiver [id=0x32e23760]
* Instance of android.app.ExitTransitionCoordinator
|   static $staticOverhead = byte[] [id=0x32c28401;length=16;size=32]
|   static MAX_WAIT_MS = 1000
|   static TAG = java.lang.String [id=0x32c50be0]
|   mActivity = fm.pause.article_detail.ArticleDetailActivity [id=0x3314c5c0]
|   mBackgroundAnimator = android.animation.ObjectAnimator [id=0x33d2c400]
|   mExitComplete = false
|   mExitNotified = false
|   mExitSharedElementBundle = android.os.Bundle [id=0x32e52ae0]
|   mHandler = android.app.ExitTransitionCoordinator$5 [id=0x33052080]
|   mIsBackgroundReady = false
|   mIsCanceled = false
|   mIsExitStarted = true
|   mIsHidden = false
|   mSharedElementBundle = null
|   mSharedElementNotified = false
|   mSharedElementsHidden = false
|   mAllSharedElementNames = java.util.ArrayList [id=0x33cb5280]
|   mEpicenterCallback = android.app.ActivityTransitionCoordinator$FixedEpicenterCallback [id=0x32fd8620]
|   mGhostViewListeners = java.util.ArrayList [id=0x33052f00]
|   mIsReturning = true
|   mIsStartingTransition = false
|   mListener = android.app.SharedElementCallback$1 [id=0x711cd7f8]
|   mOriginalAlphas = android.util.ArrayMap [id=0x33052f20]
|   mPendingTransition = null
|   mResultReceiver = android.app.EnterTransitionCoordinator [id=0x33bef2b0]
|   mRootSharedElements = java.util.ArrayList [id=0x33052f40]
|   mSharedElementNames = java.util.ArrayList [id=0x33052ec0]
|   mSharedElementParentMatrices = java.util.ArrayList [id=0x330520a0]
|   mSharedElements = java.util.ArrayList [id=0x33052ea0]
|   mTransitioningViews = java.util.ArrayList [id=0x33052ee0]
|   mWindow = com.android.internal.policy.impl.PhoneWindow [id=0x33b8ad00]
|   mHandler = android.os.Handler [id=0x33052e80]
|   mLocal = true
|   mReceiver = android.os.ResultReceiver$MyResultReceiver [id=0x32e23760]
* Instance of com.android.internal.policy.impl.PhoneWindow
|   static $staticOverhead = byte[] [id=0x7134af41;length=104;size=120]
|   static ACTION_BAR_TAG = java.lang.String [id=0x70b16080]
|   static CUSTOM_TITLE_COMPATIBLE_FEATURES = 13505
|   static DEFAULT_BACKGROUND_FADE_DURATION_MS = 300
|   static FLAG_RESOURCE_SET_ICON = 1
|   static FLAG_RESOURCE_SET_ICON_FALLBACK = 4
|   static FLAG_RESOURCE_SET_LOGO = 2
|   static FOCUSED_ID_TAG = java.lang.String [id=0x70b160b0]
|   static PANELS_TAG = java.lang.String [id=0x70b16098]
|   static SWEEP_OPEN_MENU = false
|   static TAG = java.lang.String [id=0x70b15af8]
|   static USE_DEFAULT_TRANSITION = android.transition.TransitionSet [id=0x753c6190]
|   static VIEWS_TAG = java.lang.String [id=0x70b160c8]
|   static sRotationWatcher = com.android.internal.policy.impl.PhoneWindow$RotationWatcher [id=0x753c6238]
|   mActionMenuPresenterCallback = null
|   mAllowEnterTransitionOverlap = java.lang.Boolean [id=0x711adfe0]
|   mAllowReturnTransitionOverlap = java.lang.Boolean [id=0x711adfe0]
|   mAlwaysReadCloseOnTouchAttr = false
|   mAudioManager = null
|   mBackgroundDrawable = android.graphics.drawable.ColorDrawable [id=0x33c7f480]
|   mBackgroundFadeDurationMillis = 300
|   mBackgroundFallbackResource = 17170635
|   mBackgroundResource = 0
|   mCircularProgressBar = null
|   mClipToOutline = true
|   mClosingActionMenu = false
|   mContentParent = android.widget.FrameLayout [id=0x33bfb800]
|   mContentRoot = android.widget.LinearLayout [id=0x33bfb400]
|   mContentScene = null
|   mContextMenu = null
|   mContextMenuCallback = com.android.internal.policy.impl.PhoneWindow$DialogMenuCallback [id=0x33c7d8e0]
|   mContextMenuHelper = null
|   mDecor = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x33bfb000]
|   mDecorContentParent = null
|   mDrawables = null
|   mElevation = 0.0
|   mEnterTransition = android.transition.Fade [id=0x33b7e600]
|   mExitTransition = null
|   mFixedHeightMajor = android.util.TypedValue [id=0x337bf580]
|   mFixedHeightMinor = android.util.TypedValue [id=0x337bf5b0]
|   mFixedWidthMajor = android.util.TypedValue [id=0x337bf520]
|   mFixedWidthMinor = android.util.TypedValue [id=0x337bf550]
|   mForcedNavigationBarColor = false
|   mForcedStatusBarColor = false
|   mFrameResource = 0
|   mHorizontalProgressBar = null
|   mIconRes = 0
|   mInvalidatePanelMenuFeatures = 0
|   mInvalidatePanelMenuPosted = false
|   mInvalidatePanelMenuRunnable = com.android.internal.policy.impl.PhoneWindow$1 [id=0x33c7e2b0]
|   mIsFloating = false
|   mKeyguardManager = null
|   mLayoutInflater = com.android.internal.policy.impl.PhoneLayoutInflater [id=0x337bdac0]
|   mLeftIconView = null
|   mLogoRes = 0
|   mMediaController = null
|   mMinWidthMajor = android.util.TypedValue [id=0x337bda30]
|   mMinWidthMinor = android.util.TypedValue [id=0x337bda60]
|   mNavigationBarColor = -16777216
|   mOutsetBottom = null
|   mPanelChordingKey = 0
|   mPanelMenuPresenterCallback = null
|   mPanels = null
|   mPreparedPanel = null
|   mReenterTransition = android.transition.TransitionSet [id=0x753c6190]
|   mResourcesSetFlags = 0
|   mReturnTransition = android.transition.TransitionSet [id=0x753c6190]
|   mRightIconView = null
|   mSharedElementEnterTransition = android.transition.TransitionSet [id=0x33bc10e0]
|   mSharedElementExitTransition = android.transition.TransitionSet [id=0x33bc1190]
|   mSharedElementReenterTransition = android.transition.TransitionSet [id=0x753c6190]
|   mSharedElementReturnTransition = android.transition.TransitionSet [id=0x753c6190]
|   mSharedElementsUseOverlay = java.lang.Boolean [id=0x711adfe0]
|   mStatusBarColor = -15066598
|   mTakeInputQueueCallback = null
|   mTakeSurfaceCallback = null
|   mTempRect = null
|   mTextColor = 0
|   mTitle = java.lang.String [id=0x32e4ac00]
|   mTitleColor = 0
|   mTitleView = null
|   mTransitionManager = android.transition.TransitionManager [id=0x33c7e3b0]
|   mUiOptions = 0
|   mVolumeControlStreamType = -2147483648
|   mActiveChild = null
|   mAppName = java.lang.String [id=0x33c7d980]
|   mAppToken = android.os.BinderProxy [id=0x339e58c0]
|   mCallback = android.support.v7.internal.app.ToolbarActionBar$ToolbarCallbackWrapper [id=0x33c8ca50]
|   mCloseOnTouchOutside = false
|   mContainer = null
|   mContext = fm.pause.article_detail.ArticleDetailActivity [id=0x3314c5c0]
|   mDefaultWindowFormat = -2
|   mDestroyed = false
|   mFeatures = 8259
|   mForcedWindowFlags = -2071920384
|   mHardwareAccelerated = true
|   mHasChildren = false
|   mHasSoftInputMode = false
|   mHaveDimAmount = false
|   mHaveWindowFormat = false
|   mIsActive = true
|   mLocalFeatures = 8259
|   mOnWindowDismissedCallback = fm.pause.article_detail.ArticleDetailActivity [id=0x3314c5c0]
|   mSetCloseOnTouchOutside = false
|   mWindowAttributes = android.view.WindowManager$LayoutParams [id=0x33b7e4c0]
|   mWindowManager = android.view.WindowManagerImpl [id=0x33c7d9a0]
|   mWindowStyle = android.content.res.TypedArray [id=0x3372bfd0]
* Instance of android.transition.Fade
|   static $staticOverhead = byte[] [id=0x71322ea9;length=32;size=48]
|   static DBG = false
|   static IN = 1
|   static LOG_TAG = java.lang.String [id=0x70a9e8a8]
|   static OUT = 2
|   mForcedEndVisibility = -1
|   mForcedStartVisibility = -1
|   mMode = 3
|   mAnimators = java.util.ArrayList [id=0x33c802c0]
|   mCanRemoveViews = false
|   mCurrentAnimators = java.util.ArrayList [id=0x33c802a0]
|   mDuration = -1
|   mEndValues = android.transition.TransitionValuesMaps [id=0x33c80200]
|   mEndValuesList = null
|   mEnded = false
|   mEpicenterCallback = null
|   mInterpolator = null
|   mListeners = null
|   mMatchOrder = int[] [id=0x711b2148;length=4;size=32]
|   mName = java.lang.String [id=0x70af2320]
|   mNameOverrides = null
|   mNumInstances = 0
|   mParent = null
|   mPathMotion = android.transition.Transition$1 [id=0x711b2168]
|   mPaused = false
|   mPropagation = null
|   mSceneRoot = null
|   mStartDelay = -1
|   mStartValues = android.transition.TransitionValuesMaps [id=0x33c80160]
|   mStartValuesList = null
|   mTargetChildExcludes = null
|   mTargetExcludes = null
|   mTargetIdChildExcludes = null
|   mTargetIdExcludes = null
|   mTargetIds = java.util.ArrayList [id=0x33c80120]
|   mTargetNameExcludes = null
|   mTargetNames = null
|   mTargetTypeChildExcludes = null
|   mTargetTypeExcludes = null
|   mTargetTypes = null
|   mTargets = java.util.ArrayList [id=0x33c80140]
* Instance of java.util.ArrayList
|   static $staticOverhead = byte[] [id=0x711f88c1;length=16;size=32]
|   static MIN_CAPACITY_INCREMENT = 12
|   static serialVersionUID = 8683452581122892189
|   array = java.lang.Object[] [id=0x33d493c0;length=12]
|   size = 2
|   modCount = 6
* Array of java.lang.Object[]
|   [0] = android.animation.ObjectAnimator [id=0x33d2b6f0]
|   [1] = android.animation.ObjectAnimator [id=0x33d2b7a0]
|   [2] = null
|   [3] = null
|   [4] = null
|   [5] = null
|   [6] = null
|   [7] = null
|   [8] = null
|   [9] = null
|   [10] = null
|   [11] = null
* Instance of android.animation.ObjectAnimator
|   static $staticOverhead = byte[] [id=0x712a06e9;length=16;size=32]
|   static DBG = false
|   static LOG_TAG = java.lang.String [id=0x70aa4ed8]
|   mAutoCancel = false
|   mProperty = null
|   mPropertyName = java.lang.String [id=0x70ac3f70]
|   mTarget = java.lang.ref.WeakReference [id=0x32e2d780]
|   mCurrentFraction = 0.97712016
|   mCurrentIteration = 0
|   mDelayStartTime = 0
|   mDuration = 300
|   mInitialized = true
|   mInterpolator = android.view.animation.AccelerateDecelerateInterpolator [id=0x711c12a8]
|   mPauseTime = 44413919
|   mPlayingBackwards = false
|   mPlayingState = 1
|   mRepeatCount = 0
|   mRepeatMode = 1
|   mResumed = false
|   mReversing = false
|   mRunning = true
|   mSeekFraction = -1.0
|   mStartDelay = 0
|   mStartListenersCalled = true
|   mStartTime = 44413885
|   mStarted = true
|   mStartedDelay = false
|   mUnscaledDuration = 300
|   mUnscaledStartDelay = 0
|   mUpdateListeners = null
|   mValues = android.animation.PropertyValuesHolder[] [id=0x32fd8950;length=1]
|   mValuesMap = java.util.HashMap [id=0x32e4cee0]
|   mChangingConfigurations = 0
|   mConstantState = null
|   mListeners = java.util.ArrayList [id=0x32e2d860]
|   mPauseListeners = java.util.ArrayList [id=0x32e2d880]
|   mPaused = false
* Instance of java.util.ArrayList
|   static $staticOverhead = byte[] [id=0x711f88c1;length=16;size=32]
|   static MIN_CAPACITY_INCREMENT = 12
|   static serialVersionUID = 8683452581122892189
|   array = java.lang.Object[] [id=0x32fb1b40;length=12]
|   size = 4
|   modCount = 4
* Array of java.lang.Object[]
|   [0] = android.transition.Fade$FadeAnimatorListener [id=0x32e2d840]
|   [1] = android.transition.Visibility$2 [id=0x32e2d8a0]
|   [2] = android.transition.Transition$2 [id=0x32fd8ac0]
|   [3] = android.transition.Transition$3 [id=0x32fd8af0]
|   [4] = null
|   [5] = null
|   [6] = null
|   [7] = null
|   [8] = null
|   [9] = null
|   [10] = null
|   [11] = null
* Instance of android.transition.Visibility$2
|   mCanceled = false
|   this$0 = android.transition.Fade [id=0x33cb7900]
|   val$finalViewToKeep = android.view.View [id=0x32d6fde0]
|   val$finalVisibility = 4
|   val$isForcedVisibility = true
* Instance of android.transition.Fade
|   static $staticOverhead = byte[] [id=0x71322ea9;length=32;size=48]
|   static DBG = false
|   static IN = 1
|   static LOG_TAG = java.lang.String [id=0x70a9e8a8]
|   static OUT = 2
|   mForcedEndVisibility = 4
|   mForcedStartVisibility = -1
|   mMode = 3
|   mAnimators = java.util.ArrayList [id=0x32e2d080]
|   mCanRemoveViews = false
|   mCurrentAnimators = java.util.ArrayList [id=0x33c802a0]
|   mDuration = -1
|   mEndValues = android.transition.TransitionValuesMaps [id=0x32e2d180]
|   mEndValuesList = null
|   mEnded = false
|   mEpicenterCallback = android.app.ActivityTransitionCoordinator$FixedEpicenterCallback [id=0x32fd8620]
|   mInterpolator = null
|   mListeners = java.util.ArrayList [id=0x32e2dc40]
|   mMatchOrder = int[] [id=0x711b2148;length=4;size=32]
|   mName = java.lang.String [id=0x70af2320]
|   mNameOverrides = null
|   mNumInstances = 2
|   mParent = android.transition.TransitionSet [id=0x33d2b640]
|   mPathMotion = android.transition.Transition$1 [id=0x711b2168]
|   mPaused = false
|   mPropagation = null
|   mSceneRoot = null
|   mStartDelay = -1
|   mStartValues = android.transition.TransitionValuesMaps [id=0x32e2d0a0]
|   mStartValuesList = null
|   mTargetChildExcludes = null
|   mTargetExcludes = null
|   mTargetIdChildExcludes = null
|   mTargetIdExcludes = null
|   mTargetIds = java.util.ArrayList [id=0x33c80120]
|   mTargetNameExcludes = null
|   mTargetNames = null
|   mTargetTypeChildExcludes = null
|   mTargetTypeExcludes = null
|   mTargetTypes = null
|   mTargets = java.util.ArrayList [id=0x33c80140]
* Instance of android.transition.TransitionSet
|   static $staticOverhead = byte[] [id=0x712ce111;length=16;size=32]
|   static ORDERING_SEQUENTIAL = 1
|   static ORDERING_TOGETHER = 0
|   mCurrentListeners = 1
|   mPlayTogether = true
|   mStarted = true
|   mTransitions = java.util.ArrayList [id=0x32e2d060]
|   mAnimators = java.util.ArrayList [id=0x32e23e80]
|   mCanRemoveViews = false
|   mCurrentAnimators = java.util.ArrayList [id=0x32e23de0]
|   mDuration = -1
|   mEndValues = android.transition.TransitionValuesMaps [id=0x32e23f40]
|   mEndValuesList = java.util.ArrayList [id=0x32e2d5c0]
|   mEnded = false
|   mEpicenterCallback = null
|   mInterpolator = null
|   mListeners = java.util.ArrayList [id=0x32e23e60]
|   mMatchOrder = int[] [id=0x711b2148;length=4;size=32]
|   mName = java.lang.String [id=0x70af21a0]
|   mNameOverrides = null
|   mNumInstances = 1
|   mParent = null
|   mPathMotion = android.transition.Transition$1 [id=0x711b2168]
|   mPaused = false
|   mPropagation = null
|   mSceneRoot = null
|   mStartDelay = -1
|   mStartValues = android.transition.TransitionValuesMaps [id=0x32e23ea0]
|   mStartValuesList = java.util.ArrayList [id=0x32e2d5a0]
|   mTargetChildExcludes = null
|   mTargetExcludes = null
|   mTargetIdChildExcludes = null
|   mTargetIdExcludes = null
|   mTargetIds = java.util.ArrayList [id=0x32e23c20]
|   mTargetNameExcludes = null
|   mTargetNames = null
|   mTargetTypeChildExcludes = null
|   mTargetTypeExcludes = null
|   mTargetTypes = null
|   mTargets = java.util.ArrayList [id=0x32e23c40]
* Instance of java.util.ArrayList
|   static $staticOverhead = byte[] [id=0x711f88c1;length=16;size=32]
|   static MIN_CAPACITY_INCREMENT = 12
|   static serialVersionUID = 8683452581122892189
|   array = java.lang.Object[] [id=0x32f93a80;length=12]
|   size = 2
|   modCount = 2
* Array of java.lang.Object[]
|   [0] = android.app.ExitTransitionCoordinator$9 [id=0x32e23e40]
|   [1] = android.transition.TransitionManager$MultiListener$1 [id=0x32fd8800]
|   [2] = null
|   [3] = null
|   [4] = null
|   [5] = null
|   [6] = null
|   [7] = null
|   [8] = null
|   [9] = null
|   [10] = null
|   [11] = null
* Instance of android.transition.TransitionManager$MultiListener$1
|   this$0 = android.transition.TransitionManager$MultiListener [id=0x32fd8780]
|   val$runningTransitions = android.util.ArrayMap [id=0x33418060]
* Instance of android.util.ArrayMap
|   static $staticOverhead = byte[] [id=0x7131c7d1;length=80;size=96]
|   static BASE_SIZE = 4
|   static CACHE_SIZE = 10
|   static DEBUG = false
|   static EMPTY = android.util.ArrayMap [id=0x711cd200]
|   static EMPTY_IMMUTABLE_INTS = int[] [id=0x711c1948;length=0;size=16]
|   static TAG = java.lang.String [id=0x70accf88]
|   static mBaseCache = java.lang.Object[] [id=0x32e4cdc0;length=8]
|   static mBaseCacheSize = 1
|   static mTwiceBaseCache = null
|   static mTwiceBaseCacheSize = 0
|   mArray = java.lang.Object[] [id=0x33b85060;length=16]
|   mCollections = null
|   mHashes = int[] [id=0x3371b250;length=8;size=48]
|   mSize = 6
* Array of java.lang.Object[]
|   [0] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x33acfc00]
|   [1] = java.util.ArrayList [id=0x33c1d2a0]
|   [2] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x334e2c00]
|   [3] = java.util.ArrayList [id=0x33b1c680]
|   [4] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x33816800]
|   [5] = java.util.ArrayList [id=0x336f0a40]
|   [6] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x3315b800]
|   [7] = java.util.ArrayList [id=0x33469a00]
|   [8] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x33bfb000]
|   [9] = java.util.ArrayList [id=0x33d39dc0]
|   [10] = com.android.internal.policy.impl.PhoneWindow$DecorView [id=0x3315bc00]
|   [11] = java.util.ArrayList [id=0x33966e20]
|   [12] = null
|   [13] = null
|   [14] = null
|   [15] = null
* Instance of com.android.internal.policy.impl.PhoneWindow$DecorView
|   mActionMode = null
|   mActionModePopup = null
|   mActionModeView = null
|   mBackgroundFallback = com.android.internal.widget.BackgroundFallback [id=0x3329b0a0]
|   mBackgroundPadding = android.graphics.Rect [id=0x334a2ce0]
|   mBarEnterExitDuration = 250
|   mChanging = false
|   mDefaultOpacity = -2
|   mDownY = 0
|   mDrawingBounds = android.graphics.Rect [id=0x334a2cc0]
|   mFeatureId = -1
|   mFrameOffsets = android.graphics.Rect [id=0x334a2d80]
|   mFramePadding = android.graphics.Rect [id=0x334a2d00]
|   mHideInterpolator = android.view.animation.PathInterpolator [id=0x334a2ec0]
|   mLastBottomInset = 144
|   mLastHasBottomStableInset = true
|   mLastHasTopStableInset = true
|   mLastRightInset = 0
|   mLastTopInset = 75
|   mLastWindowFlags = -2055143168
|   mMenuBackground = null
|   mNavigationColorViewState = com.android.internal.policy.impl.PhoneWindow$ColorViewState [id=0x33271d30]
|   mNavigationGuard = null
|   mRootScrollY = 0
|   mShowActionModePopup = null
|   mShowInterpolator = android.view.animation.PathInterpolator [id=0x334a2de0]
|   mStatusColorViewState = com.android.internal.policy.impl.PhoneWindow$ColorViewState [id=0x33271d00]
|   mStatusGuard = null
|   mWatchingForMenu = false
|   this$0 = com.android.internal.policy.impl.PhoneWindow [id=0x32e0ab80]
|   mForeground = null
|   mForegroundBoundsChanged = true
|   mForegroundGravity = 119
|   mForegroundInPadding = true
|   mForegroundPaddingBottom = 0
|   mForegroundPaddingLeft = 0
|   mForegroundPaddingRight = 0
|   mForegroundPaddingTop = 0
|   mForegroundTintList = null
|   mForegroundTintMode = null
|   mHasForegroundTint = false
|   mHasForegroundTintMode = false
|   mMatchParentChildren = java.util.ArrayList [id=0x334a2ca0]
|   mMeasureAllChildren = false
|   mOverlayBounds = android.graphics.Rect [id=0x334a2c60]
|   mSelfBounds = android.graphics.Rect [id=0x334a2ac0]
|   mAnimationListener = null
|   mCachePaint = null
|   mChildAcceptsDrag = false
|   mChildCountWithTransientState = 0
|   mChildTransformation = null
|   mChildren = android.view.View[] [id=0x33324c40;length=12]
|   mChildrenCount = 2
|   mCurrentDrag = null
|   mCurrentDragView = null
|   mDisappearingChildren = null
|   mDragNotifiedChildren = null
|   mFirstHoverTarget = null
|   mFirstTouchTarget = null
|   mFocused = android.widget.LinearLayout [id=0x33816c00]
|   mGroupFlags = 2375763
|   mHoveredSelf = false
|   mInvalidateRegion = null
|   mInvalidationTransformation = null
|   mLastTouchDownIndex = -1
|   mLastTouchDownTime = 0
|   mLastTouchDownX = 0.0
|   mLastTouchDownY = 0.0
|   mLayoutAnimationController = null
|   mLayoutCalledWhileSuppressed = false
|   mLayoutMode = -1
|   mLayoutTransitionListener = android.view.ViewGroup$3 [id=0x3329b080]
|   mLocalPoint = null
|   mNestedScrollAxes = 0
|   mOnHierarchyChangeListener = null
|   mPersistentDrawingCache = 2
|   mPreSortedChildren = null
|   mSuppressLayout = true
|   mTempPoint = null
|   mTransition = null
|   mTransitioningViews = null
|   mVisibilityChangingChildren = null
|   mAccessibilityCursorPosition = -1
|   mAccessibilityDelegate = null
|   mAccessibilityTraversalAfterId = -1
|   mAccessibilityTraversalBeforeId = -1
|   mAccessibilityViewId = -1
|   mAnimator = null
|   mAttachInfo = null
|   mAttributes = null
|   mBackground = android.graphics.drawable.ColorDrawable [id=0x33324e00]
|   mBackgroundRenderNode = android.view.RenderNode [id=0x33718fa0]
|   mBackgroundResource = 0
|   mBackgroundSizeChanged = false
|   mBackgroundTint = null
|   mBottom = 1920
|   mCachingFailed = false
|   mClipBounds = null
|   mContentDescription = null
|   mContext = fm.pause.article_detail.ArticleDetailActivity [id=0x331494d0]
|   mCurrentAnimation = null
|   mDrawableState = null
|   mDrawingCache = null
|   mDrawingCacheBackgroundColor = 0
|   mFloatingTreeObserver = null
|   mGhostView = null
|   mHasPerformedLongPress = false
|   mID = -1
|   mInputEventConsistencyVerifier = null
|   mKeyedTags = android.util.SparseArray [id=0x336f0720]
|   mLabelForId = -1
|   mLastIsOpaque = false
|   mLayerPaint = null
|   mLayerType = 0
|   mLayoutInsets = null
|   mLayoutParams = android.view.WindowManager$LayoutParams [id=0x33863580]
|   mLeft = 0
|   mLeftPaddingDefined = true
|   mListenerInfo = android.view.View$ListenerInfo [id=0x338acc00]
|   mMatchIdPredicate = null
|   mMatchLabelForPredicate = null
|   mMeasureCache = android.util.LongSparseLongArray [id=0x3360c160]
|   mMeasuredHeight = 1920
|   mMeasuredWidth = 1080
|   mMinHeight = 0
|   mMinWidth = 0
|   mNestedScrollingParent = null
|   mNextFocusDownId = -1
|   mNextFocusForwardId = -1
|   mNextFocusLeftId = -1
|   mNextFocusRightId = -1
|   mNextFocusUpId = -1
|   mOldHeightMeasureSpec = 1073743744
|   mOldWidthMeasureSpec = 1073742904
|   mOutlineProvider = android.view.ViewOutlineProvider$1 [id=0x711cf0d0]
|   mOverScrollMode = 1
|   mOverlay = android.view.ViewGroupOverlay [id=0x33350ef0]
|   mPaddingBottom = 0
|   mPaddingLeft = 0
|   mPaddingRight = 0
|   mPaddingTop = 0
|   mParent = null
|   mPendingCheckForLongPress = null
|   mPendingCheckForTap = null
|   mPerformClick = null
|   mPrivateFlags = -2128602056
|   mPrivateFlags2 = 1611867680
|   mPrivateFlags3 = 0
|   mRecreateDisplayList = false
|   mRenderNode = android.view.RenderNode [id=0x334a2a80]
|   mResources = android.content.res.Resources [id=0x32e35d00]
|   mRight = 1080
|   mRightPaddingDefined = true
|   mScrollCache = null
|   mScrollX = 0
|   mScrollY = 0
|   mSendViewScrolledAccessibilityEvent = null
|   mSendViewStateChangedAccessibilityEvent = null
|   mSendingHoverAccessibilityEvents = false
|   mStateListAnimator = null
|   mSystemUiVisibility = 0
|   mTag = null
|   mTempNestedScrollConsumed = null
|   mTop = 0
|   mTouchDelegate = null
|   mTouchSlop = 24
|   mTransformationInfo = android.view.View$TransformationInfo [id=0x33613b60]
|   mTransientStateCount = 0
|   mTransitionName = null
|   mUnscaledDrawingCache = null
|   mUnsetPressedState = null
|   mUserPaddingBottom = 0
|   mUserPaddingEnd = -2147483648
|   mUserPaddingLeft = 0
|   mUserPaddingLeftInitial = 0
|   mUserPaddingRight = 0
|   mUserPaddingRightInitial = 0
|   mUserPaddingStart = -2147483648
|   mVerticalScrollFactor = 0.0
|   mVerticalScrollbarPosition = 0
|   mViewFlags = 402655232
|   mWindowAttachCount = 1
* Instance of fm.pause.article_detail.ArticleDetailActivity
|   actionBar = android.support.v7.widget.Toolbar [id=0x3381a000]
|   adapter = fm.pause.article_detail.ArticleAdapter [id=0x33326b00]
|   articleId = 2135
|   bus = com.squareup.otto.Bus [id=0x32e4cc10]
|   coverGradient = android.widget.ImageView [id=0x33819000]
|   footerLink = fm.pause.article_detail.model.article_part.FooterLink [id=0x33609820]
|   headerImage = android.widget.ImageView [id=0x33818c00]
|   headerMaxSize = 900.0
|   headerMinSize = 243.0
|   miniPlayer = android.widget.FrameLayout [id=0x3381b800]
|   pageLoaded = false
|   picasso = com.squareup.picasso.Picasso [id=0x32df9dd0]
|   playlist = fm.pause.music.playlist.ImmutablePlaylist [id=0x33350590]
|   readMore = android.webkit.WebView [id=0x3381a400]
|   readerMode = false
|   recycler = android.support.v7.widget.RecyclerView [id=0x33818400]
|   repository = fm.pause.article_detail.repository.SqlBriteArticleDetailRepository [id=0x332e9900]
|   shareProviderSubject = rx.subjects.PublishSubject [id=0x335517e0]
|   slidingContainer = com.sothree.slidinguppanel.SlidingUpPanelLayout [id=0x33817c00]
|   sourceImage = android.widget.ImageView [id=0x33819400]
|   subscriptions = null
|   title = android.support.v7.widget.AppCompatTextView [id=0x33819c00]
|   titleBar = android.widget.RelativeLayout [id=0x33818800]
|   titleScrollListener = fm.pause.article_detail.ArticleDetailActivity$TitleScrollListener [id=0x332e9a50]
|   tracker = fm.pause.tracking.AppTracker [id=0x332e9910]
|   mDelegate = android.support.v7.app.AppCompatDelegateImplV14 [id=0x33863620]
|   mAllLoaderManagers = android.support.v4.util.SimpleArrayMap [id=0x33581d80]
|   mCheckedForLoaderManager = true
|   mContainer = android.support.v4.app.FragmentActivity$2 [id=0x3328fed0]
|   mCreated = true
|   mFragments = android.support.v4.app.FragmentManagerImpl [id=0x32fd4660]
|   mHandler = android.support.v4.app.FragmentActivity$1 [id=0x334a2060]
|   mLoaderManager = null
|   mLoadersStarted = false
|   mOptionsMenuInvalidated = false
|   mReallyStopped = true
|   mResumed = false
|   mRetaining = false
|   mStopped = true
|   mActionBar = null
|   mActivityInfo = android.content.pm.ActivityInfo [id=0x33369b00]
|   mActivityTransitionState = android.app.ActivityTransitionState [id=0x33324b00]
|   mAllLoaderManagers = android.util.ArrayMap [id=0x33581c00]
|   mApplication = fm.pause.PauseDebugApplication [id=0x32dfb440]
|   mCalled = true
|   mChangeCanvasToTranslucent = true
|   mChangingConfigurations = false
|   mCheckedForLoaderManager = true
|   mComponent = android.content.ComponentName [id=0x3328b090]
|   mConfigChangeFlags = 0
|   mContainer = android.app.Activity$1 [id=0x3328fe70]
|   mCurrentConfig = android.content.res.Configuration [id=0x32fc7460]
|   mDecor = null
|   mDefaultKeyMode = 0
|   mDefaultKeySsb = null
|   mDestroyed = true
|   mDoReportFullyDrawn = false
|   mEmbeddedID = null
|   mEnableDefaultActionBarUp = true
|   mEnterTransitionListener = android.app.SharedElementCallback$1 [id=0x711cd7f8]
|   mExitTransitionListener = android.app.SharedElementCallback$1 [id=0x711cd7f8]
|   mFinished = true
|   mFragments = android.app.FragmentManagerImpl [id=0x32fd45f0]
|   mHandler = android.os.Handler [id=0x33493fa0]
|   mIdent = 733393952
|   mInstanceTracker = android.os.StrictMode$InstanceTracker [id=0x3328fea0]
|   mInstrumentation = android.app.Instrumentation [id=0x32e4d650]
|   mIntent = android.content.Intent [id=0x332e0040]
|   mLastNonConfigurationInstances = null
|   mLoaderManager = null
|   mLoadersStarted = false
|   mMainThread = android.app.ActivityThread [id=0x32c03100]
|   mManagedCursors = java.util.ArrayList [id=0x33493f60]
|   mManagedDialogs = null
|   mMenuInflater = null
|   mParent = null
|   mReferrer = java.lang.String [id=0x3346cbc0]
|   mResultCode = 0
|   mResultData = null
|   mResumed = false
|   mSearchManager = null
|   mStartedActivity = false
|   mStopped = true
|   mTemporaryPause = false
|   mTitle = java.lang.String [id=0x32e4ac00]
|   mTitleColor = 0
|   mTitleReady = true
|   mToken = android.os.BinderProxy [id=0x3346c2a0]
|   mTranslucentCallback = null
|   mUiThread = java.lang.Thread [id=0x7437d000]
|   mVisibleBehind = false
|   mVisibleFromClient = true
|   mVisibleFromServer = true
|   mVoiceInteractor = null
|   mWindow = com.android.internal.policy.impl.PhoneWindow [id=0x32e0ab80]
|   mWindowAdded = true
|   mWindowManager = android.view.WindowManagerImpl [id=0x334a2580]
|   mInflater = com.android.internal.policy.impl.PhoneLayoutInflater [id=0x33271bb0]
|   mOverrideConfiguration = null
|   mResources = android.content.res.Resources [id=0x32e35d00]
|   mTheme = android.content.res.Resources$Theme [id=0x334a25c0]
|   mThemeResource = 2131558405
|   mBase = android.app.ContextImpl [id=0x32e11680]

I have also a heapdump, but it's from the app I work for. So @pyricau would it help if I sent it to you? I can send it via email/drive/etc.

I'm going to do some experiments later to see if I can figure something out.

Yky commented 8 years ago

I think the problem here is not the WebView itself but rather android.os.ResultReceiver$MyResultReceiver.this$0. I have this Leak in an Activity and I am not using a WebView.

Is there any workaround hack for this?

yukawa commented 8 years ago

This seems to be Chromium Issue 595613.

The root cause is that Chromium's ResultReceiver accidentally holds a strong reference to ContentViewCore. In this case, ResultReceiver passed to [InputMethodManager#showSoftInput(View, int, ResultReceiver)](http://developer.android.com/intl/ja/reference/android/view/inputmethod/InputMethodManager.html#showSoftInput%28android.view.View, int, android.os.ResultReceiver%29) travels from the application (process A) to InputMethodManagerService (process B) to InputMethodService (process C). A tricky point is that we probably have to wait for GC to happen in both process B and process C to see the original ResultReceiver instance in the process A finally gets released. Thus technically this may not be a permanent leak (but is problematic just because the lifetime of ContentViewCore is extended unnecessary and unpredictably).

Anyway, the strong reference to ContentViewCore was already replaced with WeakReference<ContentViewCore> by commit fcc3fbf16. Hopefully this will no longer be a big issue in Chromium / WebView version 50.

pyricau commented 8 years ago

See: Can a leak be caused by the Android SDK?.

We don't have enough time to do the investigative work on this type of issue, so I will close this issue for now. We'll happily take contributions to AndroidExcludedRefs.java, if the leak is demonstrated and the fix provided to AOSP.

ziahaqi commented 8 years ago

i had the same issue.. in my case "NO LEAK FOUND" caused by webview. the Webview located in a fragment, and i already put a piece of code like this in ondettach() method if (webView != null) { webView.removeAllViews(); webView.destroyDrawingCache(); webView.clearHistory(); webView.destroy(); } but the message still shown ? how can i fix that ?