Inmobi Android SDK: утечка памяти при использовании нативной рекламы
Я обнаружил утечку в SDK Inmobi, когда я использую нативную рекламу. Кому-нибудь удалось решить эту утечку - она вызывает ошибки OOM.
Я использую последний SDK от Inmobi:
https://bintray.com/inmobi/maven/inmobi-ads/5.3.0/view
compile('com.inmobi.monetization:inmobi-ads:5.3.0') {
exclude group: 'com.google.android.gms'
}
Это определенно проблема утечки памяти inmobi. Я попробовал это с рекламной сетью Facebook и сетями Flurry, и это не дает мне утечку памяти. Я использую mopub в качестве моего посредника.
Если это не решено, мне придется отключить inmobi, так как в конечном итоге приложение вылетит.
D/LeakCanary: In com.myapp:1.0:1.
D/LeakCanary: * com.myapp.activities.MyActivity has leaked:
D/LeakCanary: * GC ROOT static com.inmobi.ads.InMobiNative.sMappedAdUnits
D/LeakCanary: * references java.util.WeakHashMap.elementData
D/LeakCanary: * references array java.util.WeakHashMap$Entry[].[11]
D/LeakCanary: * references java.util.WeakHashMap$Entry.value
D/LeakCanary: * references com.inmobi.ads.p.l
D/LeakCanary: * references com.inmobi.ads.InMobiNative$1.a (anonymous class implements com.inmobi.ads.AdUnit$a)
D/LeakCanary: * references com.inmobi.ads.InMobiNative.mNativeAdListener
D/LeakCanary: * references com.mopub.nativeads.InMobiNative$InMobiStaticNativeAd.mNativeEventListener
D/LeakCanary: * references com.mopub.nativeads.NativeAd$1.this$0 (anonymous class implements com.mopub.nativeads.BaseNativeAd$NativeEventListener)
D/LeakCanary: * references com.mopub.nativeads.NativeAd.mMoPubAdRenderer
D/LeakCanary: * references com.mopub.nativeads.MoPubStaticNativeAdRenderer.mViewHolderMap
D/LeakCanary: * references java.util.WeakHashMap.elementData
D/LeakCanary: * references array java.util.WeakHashMap$Entry[].[11]
D/LeakCanary: * references java.util.WeakHashMap$Entry.value
D/LeakCanary: * references com.mopub.nativeads.StaticNativeViewHolder.mainView
D/LeakCanary: * references android.widget.RelativeLayout.mContext
D/LeakCanary: * leaks com.myapp.activities.MyActivity instance
D/LeakCanary: * Reference Key: 2913e4a2-c18e-46c9-8784-0eae40a7fe96
D/LeakCanary: * Device: unknown generic Google Nexus 5 - 5.1.0 - API 22 - 1080x1920 vbox86p
D/LeakCanary: * Android Version: 5.1 API: 22 LeakCanary: 1.3.1
D/LeakCanary: * Durations: watch=5025ms, gc=140ms, heap dump=1237ms, analysis=3884ms
D/LeakCanary: * Details:
D/LeakCanary: * Class com.inmobi.ads.InMobiNative
D/LeakCanary: | static $staticOverhead = byte[] [id=0x133dcdd1;length=16;size=32]
D/LeakCanary: | static TAG = java.lang.String [id=0x13904c00]
D/LeakCanary: | static sMappedAdUnits = java.util.WeakHashMap [id=0x138f7340]
D/LeakCanary: * Instance of java.util.WeakHashMap
D/LeakCanary: | static $staticOverhead = byte[] [id=0x70ad06c1;length=8;size=24]
D/LeakCanary: | static DEFAULT_SIZE = 16
D/LeakCanary: | elementCount = 2
D/LeakCanary: | elementData = java.util.WeakHashMap$Entry[] [id=0x138effb0;length=16]
D/LeakCanary: | loadFactor = 7500
D/LeakCanary: | modCount = 4
D/LeakCanary: | referenceQueue = java.lang.ref.ReferenceQueue [id=0x138fc550]
D/LeakCanary: | threshold = 12
D/LeakCanary: | keySet = null
D/LeakCanary: | valuesCollection = null
D/LeakCanary: * Array of java.util.WeakHashMap$Entry[]
D/LeakCanary: | [0] = null
D/LeakCanary: | [1] = null
D/LeakCanary: | [2] = null
D/LeakCanary: | [3] = null
D/LeakCanary: | [4] = null
D/LeakCanary: | [5] = null
D/LeakCanary: | [6] = null
D/LeakCanary: | [7] = null
D/LeakCanary: | [8] = java.util.WeakHashMap$Entry [id=0x136082e0]
D/LeakCanary: | [9] = null
D/LeakCanary: | [10] = null
D/LeakCanary: | [11] = java.util.WeakHashMap$Entry [id=0x139dafa0]
D/LeakCanary: | [12] = null
D/LeakCanary: | [13] = null
D/LeakCanary: | [14] = null
D/LeakCanary: | [15] = null
D/LeakCanary: * Instance of java.util.WeakHashMap$Entry
D/LeakCanary: | hash = -380383093
D/LeakCanary: | isNull = false
D/LeakCanary: | next = null
D/LeakCanary: | value = com.inmobi.ads.p [id=0x13568680]
D/LeakCanary: | pendingNext = null
D/LeakCanary: | queue = java.lang.ref.ReferenceQueue [id=0x138fc550]
D/LeakCanary: | queueNext = null
D/LeakCanary: | referent = android.widget.RelativeLayout [id=0x13aa1800]
D/LeakCanary: * Instance of com.inmobi.ads.p
D/LeakCanary: | static $staticOverhead = byte[] [id=0x134f0c01;length=8;size=24]
D/LeakCanary: | static a = java.lang.String [id=0x1390e420]
D/LeakCanary: | b = java.util.HashMap [id=0x13977f40]
D/LeakCanary: | c = java.util.WeakHashMap [id=0x13977f70]
D/LeakCanary: | d = java.lang.String [id=0x136707c0]
D/LeakCanary: | e = java.lang.String [id=0x13670ba0]
D/LeakCanary: | f = com.inmobi.ads.n [id=0x1399c2e0]
D/LeakCanary: | g = null
D/LeakCanary: | h = null
D/LeakCanary: | i = 0
D/LeakCanary: | j = 4640027
D/LeakCanary: | b = com.inmobi.ads.AdUnit$AdState [id=0x138fc880]
D/LeakCanary: | c = com.myapp.activities.KwaaiApplication [id=0x12c08c00]
D/LeakCanary: | d = 1458854656949
D/LeakCanary: | e = null
D/LeakCanary: | f = java.util.HashMap [id=0x13977700]
D/LeakCanary: | g = com.inmobi.ads.b [id=0x13393a80]
D/LeakCanary: | h = java.lang.String [id=0x1366fc20]
D/LeakCanary: | i = java.lang.String [id=0x1366f5a0]
D/LeakCanary: | j = 1460901143476
D/LeakCanary: | k = false
D/LeakCanary: | l = com.inmobi.ads.InMobiNative$1 [id=0x135a2160]
D/LeakCanary: | m = com.inmobi.rendering.RenderView [id=0x13e3b800]
D/LeakCanary: | n = com.inmobi.ads.an [id=0x1365dc60]
D/LeakCanary: | o = 1460901149036
D/LeakCanary: | p = 4640041
D/LeakCanary: * Instance of com.inmobi.ads.InMobiNative$1
D/LeakCanary: | a = com.inmobi.ads.InMobiNative [id=0x136599c0]
D/LeakCanary: * Instance of com.inmobi.ads.InMobiNative
D/LeakCanary: | static $staticOverhead = byte[] [id=0x133dcdd1;length=16;size=32]
D/LeakCanary: | static TAG = java.lang.String [id=0x13904c00]
D/LeakCanary: | static sMappedAdUnits = java.util.WeakHashMap [id=0x138f7340]
D/LeakCanary: | mClientCallbackHandler = com.inmobi.ads.InMobiNative$a [id=0x13977fd0]
D/LeakCanary: | mListener = com.inmobi.ads.InMobiNative$1 [id=0x135a2160]
D/LeakCanary: | mNativeAdListener = com.mopub.nativeads.InMobiNative$InMobiStaticNativeAd [id=0x13482b80]
D/LeakCanary: | mNativeAdUnit = com.inmobi.ads.p [id=0x13568680]
D/LeakCanary: * Instance of com.mopub.nativeads.InMobiNative$InMobiStaticNativeAd
D/LeakCanary: | static $staticOverhead = byte[] [id=0x134d2801;length=80;size=96]
D/LeakCanary: | static $change = null
D/LeakCanary: | static CTA = java.lang.String [id=0x13904180]
D/LeakCanary: | static DESCRIPTION = java.lang.String [id=0x70390868]
D/LeakCanary: | static ICON = java.lang.String [id=0x70396ad8]
D/LeakCanary: | static IMPRESSION_MIN_TIME_VIEWED = 1000
D/LeakCanary: | static LANDING_URL = java.lang.String [id=0x13904220]
D/LeakCanary: | static RATING = java.lang.String [id=0x13904260]
D/LeakCanary: | static SCREENSHOTS = java.lang.String [id=0x13904280]
D/LeakCanary: | static TITLE = java.lang.String [id=0x703a4548]
D/LeakCanary: | static URL = java.lang.String [id=0x703a5820]
D/LeakCanary: | mContext = com.myapp.activities.KwaaiApplication [id=0x12c08c00]
D/LeakCanary: | mCustomEventNativeListener = com.mopub.nativeads.MoPubNative$3 [id=0x1359e320]
D/LeakCanary: | mImNative = com.inmobi.ads.InMobiNative [id=0x136599c0]
D/LeakCanary: | mImpressionTracker = com.mopub.nativeads.ImpressionTracker [id=0x13977730]
D/LeakCanary: | mNativeClickHandler = com.mopub.nativeads.NativeClickHandler [id=0x136592a0]
D/LeakCanary: | mCallToAction = java.lang.String [id=0x13680f60]
D/LeakCanary: | mClickDestinationUrl = java.lang.String [id=0x13680ec0]
D/LeakCanary: | mExtras = java.util.HashMap [id=0x13977850]
D/LeakCanary: | mIconImageUrl = java.lang.String [id=0x13680740]
D/LeakCanary: | mImpressionMinTimeViewed = 1000
D/LeakCanary: | mImpressionRecorded = true
D/LeakCanary: | mMainImageUrl = java.lang.String [id=0x13680c00]
D/LeakCanary: | mPrivacyInformationIconClickThroughUrl = null
D/LeakCanary: | mPrivacyInformationIconImageUrl = null
D/LeakCanary: | mStarRating = java.lang.Double [id=0x135b7130]
D/LeakCanary: | mText = java.lang.String [id=0x13680400]
D/LeakCanary: | mTitle = java.lang.String [id=0x13680260]
D/LeakCanary: | mClickTrackers = java.util.HashSet [id=0x135a2120]
D/LeakCanary: | mImpressionTrackers = java.util.HashSet [id=0x135a2110]
D/LeakCanary: | mNativeEventListener = com.mopub.nativeads.NativeAd$1 [id=0x135b7210]
D/LeakCanary: * Instance of com.mopub.nativeads.NativeAd$1
D/LeakCanary: | this$0 = com.mopub.nativeads.NativeAd [id=0x1399cd60]
D/LeakCanary: * Instance of com.mopub.nativeads.NativeAd
D/LeakCanary: | mAdUnitId = java.lang.String [id=0x12df3320]
D/LeakCanary: | mBaseNativeAd = com.mopub.nativeads.InMobiNative$InMobiStaticNativeAd [id=0x13482b80]
D/LeakCanary: | mClickTrackers = java.util.HashSet [id=0x135b71d0]
D/LeakCanary: | mContext = com.myapp.activities.KwaaiApplication [id=0x12c08c00]
D/LeakCanary: | mImpressionTrackers = java.util.HashSet [id=0x135b7190]
D/LeakCanary: | mIsClicked = false
D/LeakCanary: | mIsDestroyed = true
D/LeakCanary: | mMoPubAdRenderer = com.mopub.nativeads.MoPubStaticNativeAdRenderer [id=0x135517a0]
D/LeakCanary: | mMoPubNativeEventListener = null
D/LeakCanary: | mRecordedImpression = true
D/LeakCanary: * Instance of com.mopub.nativeads.MoPubStaticNativeAdRenderer
D/LeakCanary: | mViewBinder = com.mopub.nativeads.ViewBinder [id=0x13781d00]
D/LeakCanary: | mViewHolderMap = java.util.WeakHashMap [id=0x13781d60]
D/LeakCanary: * Instance of java.util.WeakHashMap
D/LeakCanary: | static $staticOverhead = byte[] [id=0x70ad06c1;length=8;size=24]
D/LeakCanary: | static DEFAULT_SIZE = 16
D/LeakCanary: | elementCount = 1
D/LeakCanary: | elementData = java.util.WeakHashMap$Entry[] [id=0x138b3510;length=16]
D/LeakCanary: | loadFactor = 7500
D/LeakCanary: | modCount = 1
D/LeakCanary: | referenceQueue = java.lang.ref.ReferenceQueue [id=0x135517b0]
D/LeakCanary: | threshold = 12
D/LeakCanary: | keySet = null
D/LeakCanary: | valuesCollection = null
D/LeakCanary: * Array of java.util.WeakHashMap$Entry[]
D/LeakCanary: | [0] = null
D/LeakCanary: | [1] = null
D/LeakCanary: | [2] = null
D/LeakCanary: | [3] = null
D/LeakCanary: | [4] = null
D/LeakCanary: | [5] = null
D/LeakCanary: | [6] = null
D/LeakCanary: | [7] = null
D/LeakCanary: | [8] = null
D/LeakCanary: | [9] = null
D/LeakCanary: | [10] = null
D/LeakCanary: | [11] = java.util.WeakHashMap$Entry [id=0x139e81c0]
D/LeakCanary: | [12] = null
D/LeakCanary: | [13] = null
D/LeakCanary: | [14] = null
D/LeakCanary: | [15] = null
D/LeakCanary: * Instance of java.util.WeakHashMap$Entry
D/LeakCanary: | hash = -380383093
D/LeakCanary: | isNull = false
D/LeakCanary: | next = null
D/LeakCanary: | value = com.mopub.nativeads.StaticNativeViewHolder [id=0x139e8190]
D/LeakCanary: | pendingNext = null
D/LeakCanary: | queue = java.lang.ref.ReferenceQueue [id=0x135517b0]
D/LeakCanary: | queueNext = null
D/LeakCanary: | referent = android.widget.RelativeLayout [id=0x13aa1800]
D/LeakCanary: * Instance of com.mopub.nativeads.StaticNativeViewHolder
D/LeakCanary: | static $staticOverhead = byte[] [id=0x13918721;length=8;size=24]
D/LeakCanary: | static EMPTY_VIEW_HOLDER = com.mopub.nativeads.StaticNativeViewHolder [id=0x136ea940]
D/LeakCanary: | callToActionView = com.myapp.customshapes.ForegroundTextView [id=0x13aa3c00]
D/LeakCanary: | iconImageView = android.support.v7.widget.AppCompatImageView [id=0x13aa2000]
D/LeakCanary: | mainImageView = android.support.v7.widget.AppCompatImageView [id=0x13aa4000]
D/LeakCanary: | mainView = android.widget.RelativeLayout [id=0x13aa1800]
D/LeakCanary: | privacyInformationIconImageView = android.support.v7.widget.AppCompatImageView [id=0x13aa2c00]
D/LeakCanary: | textView = android.support.v7.widget.AppCompatTextView [id=0x13aa3000]
D/LeakCanary: | titleView = android.support.v7.widget.AppCompatTextView [id=0x13aa2400]
D/LeakCanary: * Instance of android.widget.RelativeLayout
D/LeakCanary: | static $staticOverhead = byte[] [id=0x70b71671;length=224;size=240]
D/LeakCanary: | static ABOVE = 2
D/LeakCanary: | static ALIGN_BASELINE = 4
D/LeakCanary: | static ALIGN_BOTTOM = 8
D/LeakCanary: | static ALIGN_END = 19
D/LeakCanary: | static ALIGN_LEFT = 5
D/LeakCanary: | static ALIGN_PARENT_BOTTOM = 12
D/LeakCanary: | static ALIGN_PARENT_END = 21
D/LeakCanary: | static ALIGN_PARENT_LEFT = 9
D/LeakCanary: | static ALIGN_PARENT_RIGHT = 11
D/LeakCanary: | static ALIGN_PARENT_START = 20
D/LeakCanary: | static ALIGN_PARENT_TOP = 10
D/LeakCanary: | static ALIGN_RIGHT = 7
D/LeakCanary: | static ALIGN_START = 18
D/LeakCanary: | static ALIGN_TOP = 6
D/LeakCanary: | static BELOW = 3
D/LeakCanary: | static CENTER_HORIZONTAL = 14
D/LeakCanary: | static CENTER_IN_PARENT = 13
D/LeakCanary: | static CENTER_VERTICAL = 15
D/LeakCanary: | static DEFAULT_WIDTH = 65536
D/LeakCanary: | static END_OF = 17
D/LeakCanary: | static LEFT_OF = 0
D/LeakCanary: | static RIGHT_OF = 1
D/LeakCanary: | static RULES_HORIZONTAL = int[] [id=0x70a9a650;length=8;size=48]
D/LeakCanary: | static RULES_VERTICAL = int[] [id=0x70a9b310;length=5;size=32]
D/LeakCanary: | static START_OF = 16
D/LeakCanary: | static TRUE = -1
D/LeakCanary: | static VALUE_NOT_SET = -2147483648
D/LeakCanary: | static VERB_COUNT = 22
D/LeakCanary: | mAllowBrokenMeasureSpecs = false
D/LeakCanary: | mBaselineView = null
D/LeakCanary: | mContentBounds = android.graphics.Rect [id=0x136d01c0]
D/LeakCanary: | mDirtyHierarchy = false
D/LeakCanary: | mGraph = android.widget.RelativeLayout$DependencyGraph [id=0x136d0260]
D/LeakCanary: | mGravity = 8388659
D/LeakCanary: | mHasBaselineAlignedChild = false
D/LeakCanary: | mIgnoreGravity = -1
D/LeakCanary: | mMeasureVerticalWithPaddingMargin = true
D/LeakCanary: | mSelfBounds = android.graphics.Rect [id=0x136d0240]
D/LeakCanary: | mSortedHorizontalChildren = android.view.View[] [id=0x136d2f00;length=2]
D/LeakCanary: | mSortedVerticalChildren = android.view.View[] [id=0x136d2ee0;length=2]
D/LeakCanary: | mTopToBottomLeftToRightSet = null
D/LeakCanary: | mAnimationListener = null
D/LeakCanary: | mCachePaint = null
D/LeakCanary: | mChildAcceptsDrag = false
D/LeakCanary: | mChildCountWithTransientState = 0
D/LeakCanary: | mChildTransformation = null
D/LeakCanary: | mChildren = android.view.View[] [id=0x133771c0;length=12]
D/LeakCanary: | mChildrenCount = 2
D/LeakCanary: | mCurrentDrag = null
D/LeakCanary: | mCurrentDragView = null
D/LeakCanary: | mDisappearingChildren = null
D/LeakCanary: | mDragNotifiedChildren = null
D/LeakCanary: | mFirstHoverTarget = null
D/LeakCanary: | mFirstTouchTarget = null
D/LeakCanary: | mFocused = null
D/LeakCanary: | mGroupFlags = 2244691
D/LeakCanary: | mHoveredSelf = false
D/LeakCanary: | mInvalidateRegion = null
D/LeakCanary: | mInvalidationTransformation = null
D/LeakCanary: | mLastTouchDownIndex = 1
D/LeakCanary: | mLastTouchDownTime = 4647420
D/LeakCanary: | mLastTouchDownX = 475.55966
D/LeakCanary: | mLastTouchDownY = 582.7595
D/LeakCanary: | mLayoutAnimationController = null
D/LeakCanary: | mLayoutCalledWhileSuppressed = false
D/LeakCanary: | mLayoutMode = -1
D/LeakCanary: | mLayoutTransitionListener = android.view.ViewGroup$3 [id=0x135b7d70]
D/LeakCanary: | mLocalPoint = null
D/LeakCanary: | mNestedScrollAxes = 0
D/LeakCanary: | mOnHierarchyChangeListener = null
D/LeakCanary: | mPersistentDrawingCache = 2
D/LeakCanary: | mPreSortedChildren = java.util.ArrayList [id=0x13760120]
D/LeakCanary: | mSuppressLayout = false
D/LeakCanary: | mTempPoint = float[] [id=0x13760160;length=2;size=24]
D/LeakCanary: | mTransition = null
D/LeakCanary: | mTransitioningViews = null
D/LeakCanary: | mVisibilityChangingChildren = null