LeakCanary报告了我们的应用程序中存在内存泄漏,泄漏跟踪如下:
05-24 08:41:05.380044 16534 19408 D LeakCanary: HeapAnalysisSuccess(heapDumpFile=/data/user/0/..../files/leakcanary/2020-05-24_08-24-07_502.hprof, createdAtTimeMillis=1590334865374, analysisDurationMillis=85525, applicationLeaks=[ApplicationLeak(className=<>.media.MediaControlActivity, leakTrace=
05-24 08:41:05.380044 16534 19408 D LeakCanary: ┬
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ android.provider.FontsContract
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: NO (HomeApplication↓ is not leaking and a class is never leaking)
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ GC Root: System class
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ static FontsContract.sContext
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ <>.application.HomeApplication
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: NO (Application is a singleton)
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ HomeApplication does not wrap an activity context
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ HomeApplication.mLoadedApk
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~~~~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ android.app.LoadedApk
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ LoadedApk.mReceivers
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~~~~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ android.util.ArrayMap
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ArrayMap.mArray
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ java.lang.Object[]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ array Object[].[9]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ android.util.ArrayMap
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ArrayMap.mArray
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ java.lang.Object[]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ array Object[].[58]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ ayf
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ayf.a
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ ayg
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ayg.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ als
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ als.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ alt
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ alt.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ╰→ <>.media.MediaControlActivity
05-24 08:41:05.380044 16534 19408 D LeakCanary: Leaking: YES (Activity#mDestroyed is true and ObjectWatcher was watching this)
05-24 08:41:05.380044 16534 19408 D LeakCanary: key = 758a249e-d3c7-44e3-b633-4649a5574735
05-24 08:41:05.380044 16534 19408 D LeakCanary: watchDurationMillis = 5397
05-24 08:41:05.380044 16534 19408 D LeakCanary: retainedDurationMillis = 393
05-24 08:41:05.380044 16534 19408 D LeakCanary: , retainedHeapByteSize=43842), ApplicationLeak(className=aym, leakTrace=
05-24 08:41:05.380044 16534 19408 D LeakCanary: ┬从这一点上,我理解了原因在MediaControlActivity的某个地方。另外,我看到存储的引用开始于Application类/
但我不明白的是这两者是如何联系在一起的,因为跟踪中的一些行是模糊的,这一部分具体如下:
├─ java.lang.Object[]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ array Object[].[58]
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~~~~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ ayf
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ayf.a
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ ayg
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ ayg.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ als
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ als.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~
05-24 08:41:05.380044 16534 19408 D LeakCanary: ├─ alt
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ Leaking: UNKNOWN
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ↓ alt.b
05-24 08:41:05.380044 16534 19408 D LeakCanary: │ ~所以,我的问题是:-为什么这里的跟踪是模糊的?是不是因为proguard?如果不是,还有什么?
发布于 2020-06-06 06:02:08
跟踪是模糊的,因为代码是模糊的。如果您为该构建启用了Proguard,那么有一个插件可以帮助LeakCanary:https://square.github.io/leakcanary/recipes/#using-leakcanary-with-obfuscated-apps
如果您没有启用Proguard,那么很可能是因为您使用的库已经被混淆。你应该试着找出它是哪个库。
https://stackoverflow.com/questions/62213443
复制相似问题