QMUI_Android icon indicating copy to clipboard operation
QMUI_Android copied to clipboard

Fragment缓存View导致内存泄露

Open fuhaodev opened this issue 4 years ago • 0 comments

运行环境

  • [x] 设备型号:如:Xiaom 10
  • [x] 设备系统版本:如 Android 11
  • [x] Gradle 版本:如 7.0.2
  • [x] QMUI Android 版本:2.0.1

具体问题描述

QMUIFragment的onCreateView的只在第一次创建的时候调用,如果startFragment打开新的fragment在返回上一个fragment,不会再走onCreateView,在这个前提下,如果在onDestroyView中做一些销毁操作,由于onDestroyView和onCreateView并不是成对出现,就会导致空指针,比如在onCreateView中初始化ViewBinding,在onDestroyView中viewBinding=null,但是如果不这样做又会导致严重的内存泄露,GC log一直打印

问题截图

截屏2021-09-23 13 44 48

异常日志(堆栈)

2021-09-23 13:28:36.552 28539-28539/com.example.demo D/LeakCanary: Watching instance of android.widget.FrameLayout (android.widget.FrameLayout received View#onDetachedFromWindow() callback) with key 95ed01ec-0ac9-4b9c-bd1c-360b53b9f60f 2021-09-23 13:28:36.560 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: PARSING_HEAP_DUMP 2021-09-23 13:28:36.689 28539-28569/com.example.demo D/LeakCanary: Setting up flushing for Thread[IntentService[HeapAnalyzerService],5,main] 2021-09-23 13:28:37.386 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: EXTRACTING_METADATA 2021-09-23 13:28:37.521 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: FINDING_RETAINED_OBJECTS 2021-09-23 13:28:37.526 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: FINDING_PATHS_TO_RETAINED_OBJECTS 2021-09-23 13:28:39.448 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: FINDING_DOMINATORS 2021-09-23 13:28:39.817 28539-28929/com.example.demo D/LeakCanary: Found 4 paths to retained objects 2021-09-23 13:28:39.817 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: INSPECTING_OBJECTS 2021-09-23 13:28:39.904 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: COMPUTING_NATIVE_RETAINED_SIZE 2021-09-23 13:28:40.088 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: COMPUTING_RETAINED_SIZE 2021-09-23 13:28:40.170 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: BUILDING_LEAK_TRACES 2021-09-23 13:28:40.177 28539-28929/com.example.demo D/LeakCanary: Analysis in progress, working on: REPORTING_HEAP_ANALYSIS 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ==================================== 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: HEAP ANALYSIS RESULT 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ==================================== 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: 4 APPLICATION LEAKS 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: References underlined with "~~~" are likely causes. 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: Learn more at https://squ.re/leaks. 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: 1991 bytes retained by leaking objects 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: Signature: 4e9f9851fc1b9681964bb5c34424773f33cd3 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ┬─── 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ GC Root: System class 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.view.inputmethod.InputMethodManager class 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (InputMethodManager↓ is not leaking and a class is never leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ static InputMethodManager.sInstance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.view.inputmethod.InputMethodManager instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecyclerView↓ is not leaking and InputMethodManager is a singleton) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ InputMethodManager.mCurRootView 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.view.ViewRootImpl instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecyclerView↓ is not leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mContext instance of com.android.internal.policy.DecorContext, wrapping activity com.example.demo.ui.MainActivity 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ with mDestroyed = false 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ViewRootImpl#mView is not null 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mWindowAttributes.mTitle = "com.example.demo/com.example.demo.ui.MainActivity" 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mWindowAttributes.type = 1 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ ViewRootImpl.mAttachInfo 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.view.View$AttachInfo instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecyclerView↓ is not leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ View$AttachInfo.mScrollContainers 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ java.util.ArrayList instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecyclerView↓ is not leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayList.elementData 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecyclerView↓ is not leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[0] 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ androidx.recyclerview.widget.RecyclerView instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (FrameLayout↓ is not leaking and View attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View is part of a window view hierarchy 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mID = R.id.recycler_view 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mWindowAttachCount = 5 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ View.mParent 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.widget.FrameLayout instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (QMUIWindowInsetLayout↓ is not leaking and View attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View is part of a window view hierarchy 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mWindowAttachCount = 5 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ View.mParent 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ com.qmuiteam.qmui.widget.QMUIWindowInsetLayout instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (View attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View is part of a window view hierarchy 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ View.mWindowAttachCount = 5 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ View.mParent 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ~~~~~~~ 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ╰→ com.qmuiteam.qmui.arch.SwipeBackLayout instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ Leaking: YES (ObjectWatcher was watching this because com.example.demo.ui.home.DeviceFragment received 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks). Conflicts with 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ View attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ Retaining 2.0 kB in 37 objects 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ key = 950eb2d1-1d93-425d-bf9b-f4cc267b42c6 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 5868 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 867 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ key = a3599fcb-04e1-4c08-907e-b9e99e1316d5 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 158533 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 153531 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ View is part of a window view hierarchy 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ View.mWindowAttachCount = 5 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ​ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: 1983 bytes retained by leaking objects 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: Signature: d3156677c75dd2d4d22f6ed6bcc77615cd8140eb 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ┬─── 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ GC Root: System class 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread class 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ static ActivityThread.sCurrentActivityThread 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread instance 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mInitialApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mSystemContext instance of android.app.ContextImpl 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ mSystemUiContext instance of android.app.ContextImpl 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: │ ↓ ActivityThread.mOnPauseListeners 2021-09-23 13:28:40.209 28539-28929/com.example.demo D/LeakCanary: ├─ android.util.ArrayMap instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayMap.mArray 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[0] 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.MainActivity instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MyFragment↓ is not leaking and Activity#mDestroyed is false) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mBase instance of androidx.appcompat.view.ContextThemeWrapper 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ComponentActivity.mOnBackPressedDispatcher 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ androidx.activity.OnBackPressedDispatcher instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MyFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ OnBackPressedDispatcher.mOnBackPressedCallbacks 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.util.ArrayDeque instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MyFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayDeque.elements 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MyFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[2] 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.qmuiteam.qmui.arch.QMUIFragment$2 instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MyFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Anonymous subclass of androidx.activity.OnBackPressedCallback 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment$2.this$0 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.home.MyFragment instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (Fragment#mFragmentManager is not null) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment.mCacheSwipeBackView 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ~~~~~~~~~~~~~~~~~~~ 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ╰→ com.qmuiteam.qmui.arch.SwipeBackLayout instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Leaking: YES (ObjectWatcher was watching this because com.example.demo.ui.home.MyFragment received 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks). Conflicts with 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View attached) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Retaining 2.0 kB in 36 objects 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ key = be823a37-725b-4915-8c5a-3bb7a1a06b50 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 5867 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 866 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ key = 1a9e5b7b-22e8-4cb6-ba04-4fbbddad1ac9 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 158532 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 153531 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View is part of a window view hierarchy 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View.mWindowAttachCount = 5 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: 1983 bytes retained by leaking objects 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: Signature: dc9213fea62569ed0ef2a754f71a84f63814e2a 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ┬─── 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ GC Root: System class 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread class 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ static ActivityThread.sCurrentActivityThread 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mInitialApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mSystemContext instance of android.app.ContextImpl 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mSystemUiContext instance of android.app.ContextImpl 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ActivityThread.mOnPauseListeners 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.util.ArrayMap instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayMap.mArray 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[0] 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.MainActivity instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecordFragment↓ is not leaking and Activity#mDestroyed is false) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mBase instance of androidx.appcompat.view.ContextThemeWrapper 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ComponentActivity.mOnBackPressedDispatcher 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ androidx.activity.OnBackPressedDispatcher instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecordFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ OnBackPressedDispatcher.mOnBackPressedCallbacks 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.util.ArrayDeque instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecordFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayDeque.elements 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecordFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[7] 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.qmuiteam.qmui.arch.QMUIFragment$2 instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (RecordFragment↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Anonymous subclass of androidx.activity.OnBackPressedCallback 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment$2.this$0 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.home.RecordFragment instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (Fragment#mFragmentManager is not null) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment.mCacheSwipeBackView 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ~~~~~~~~~~~~~~~~~~~ 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ╰→ com.qmuiteam.qmui.arch.SwipeBackLayout instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Leaking: YES (ObjectWatcher was watching this because com.example.demo.ui.home.RecordFragment received 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks). Conflicts with 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View attached) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ Retaining 2.0 kB in 36 objects 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ key = 01deb10a-e84f-4465-8b8d-76eb8577daa3 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 5870 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 867 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ key = 9462c3c4-95ea-4473-be79-80a26dbebfcf 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 158534 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 153532 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View is part of a window view hierarchy 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ View.mWindowAttachCount = 5 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ​ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: 1983 bytes retained by leaking objects 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: Signature: 770a9b6ba6478c026a77878533c3c4177e114 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ┬─── 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ GC Root: System class 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread class 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking and a class is never leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ static ActivityThread.sCurrentActivityThread 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.app.ActivityThread instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mInitialApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mSystemContext instance of android.app.ContextImpl 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mSystemUiContext instance of android.app.ContextImpl 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ActivityThread.mOnPauseListeners 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ android.util.ArrayMap instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayMap.mArray 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (MainActivity↓ is not leaking) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[0] 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.MainActivity instance 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (ScanFragment↓ is not leaking and Activity#mDestroyed is false) 2021-09-23 13:28:40.210 28539-28929/com.example.demo D/LeakCanary: │ mApplication instance of com.example.demo.XSureApp 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ mBase instance of androidx.appcompat.view.ContextThemeWrapper 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ ComponentActivity.mOnBackPressedDispatcher 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ├─ androidx.activity.OnBackPressedDispatcher instance 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (ScanFragment↓ is not leaking) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ OnBackPressedDispatcher.mOnBackPressedCallbacks 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ├─ java.util.ArrayDeque instance 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (ScanFragment↓ is not leaking) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ ArrayDeque.elements 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ├─ java.lang.Object[] array 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (ScanFragment↓ is not leaking) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ Object[].[9] 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ├─ com.qmuiteam.qmui.arch.QMUIFragment$2 instance 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (ScanFragment↓ is not leaking) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Anonymous subclass of androidx.activity.OnBackPressedCallback 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment$2.this$0 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ├─ com.example.demo.ui.home.ScanFragment instance 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ Leaking: NO (Fragment#mFragmentManager is not null) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ↓ QMUIFragment.mCacheSwipeBackView 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: │ ~~~~~~~~~~~~~~~~~~~ 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ╰→ com.qmuiteam.qmui.arch.SwipeBackLayout instance 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ Leaking: YES (ObjectWatcher was watching this because com.example.demo.ui.home.ScanFragment received 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ Fragment#onDestroyView() callback (references to its views should be cleared to prevent leaks). Conflicts with 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ View attached) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ Retaining 2.0 kB in 36 objects 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ key = ef6bf787-90c7-40d0-8a35-6432b0edba46 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 5869 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 867 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ key = d5a57fe5-d86b-4a82-9639-c7cb06cc7185 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ watchDurationMillis = 158533 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ retainedDurationMillis = 153531 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ View is part of a window view hierarchy 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ View.mAttachInfo is not null (view attached) 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ View.mWindowAttachCount = 5 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ​ mContext instance of com.example.demo.ui.MainActivity with mDestroyed = false 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ==================================== 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: 0 LIBRARY LEAKS 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over. 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: See https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ==================================== 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: 0 UNREACHABLE OBJECTS 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: An unreachable object is still in memory but LeakCanary could not find a strong reference path 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: from GC roots. 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ==================================== 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: METADATA 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Please include this in bug reports and Stack Overflow questions. 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Build.VERSION.SDK_INT: 30 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Build.MANUFACTURER: Xiaomi 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: LeakCanary version: 2.7 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: App process name: com.example.demo 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Stats: LruCache[maxSize=3000,hits=4925,misses=73277,hitRate=6%] 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: RandomAccess[bytes=3987077,reads=73277,travel=31963794702,range=22931107,size=29175774] 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Heap dump reason: 8 retained objects, app is visible 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Analysis duration: 3614 ms 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Heap dump file path: /storage/emulated/0/Download/leakcanary-com.example.demo/2021-09-23_13-28-34_969.hprof 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Heap dump timestamp: 1632374920174 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: Heap dump duration: 1215 ms 2021-09-23 13:28:40.211 28539-28929/com.example.demo D/LeakCanary: ====================================

fuhaodev avatar Sep 23 '21 05:09 fuhaodev