利用 LeakCanary 来检查 Android 内存泄漏 6.0以上版本空指针解决

本文介绍如何使用LeakCanary库检测Android应用中的内存泄漏。针对Android 6.0及以上版本,提供了详细的配置指南及错误排查方法。
LeakCanary 是一个开源的在debug(Relese)版本中检测内存泄漏的java库,链接:
https://github.com/square/leakcanary

你也许会遇到如下类似错误

1.3. 在6.0预览版报错

* FAILURE:

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

at com.squareup.leakcanary.HeapAnalyzer.findLeakingReference(HeapAnalyzer.java:160)

at com.squareup.leakcanary.HeapAnalyzer.checkForLeak(HeapAnalyzer.java:95)

at com.squareup.leakcanary.internal.HeapAnalyzerService.onHandleIntent(HeapAnalyzerService.java:57)

at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:66)

at android.os.Handler.dispatchMessage(Handler.java:102)

at android.os.Looper.loop(Looper.java:148)

at android.os.HandlerThread.run(HandlerThread.java:61)

之前我们的配置也许是这样的:

dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3'

releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3'

}

在Application中:

publicclassExampleApplicationextendsApplication{

@OverridepublicvoidonCreate(){

super.onCreate();

LeakCanary.install(this);}}


新更新的SDK 1.5版本,已经完美解决、android6.0以上运行时权限,Notification无法弹出的问题,需要重新配置

  build.gradle:

 dependencies {
   debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
   releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
   testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
 }
public class ExampleApplication extends Application {

  @Override public void onCreate() {
    super.onCreate();
    if (LeakCanary.isInAnalyzerProcess(this)) {
      // This process is dedicated to LeakCanary for heap analysis.
      // You should not init your app in this process.
      return;
    }
    LeakCanary.install(this);
    // Normal app init code...
  }
}

==================================== 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D HEAP ANALYSIS RESULT 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2 APPLICATION LEAKS 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D References underlined with "~~~" are likely causes. 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Learn more at https://squ.re/leaks. 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D 2647654 bytes retained by leaking objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Displaying only 1 leak trace out of 4 with the same signature 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D Signature: fdec896f9915b97d8eb71b3c37007a9eeb7b6c35 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ┬─── 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ GC Root: Thread object 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.utils.PDH$3 instance 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 675.5 kB in 7599 objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Anonymous subclass of java.lang.Thread 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Thread name: 'Thread-46' 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ PDH$3.val$paCallBack 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~~~~~~~~ 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew$1 instance 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 670.2 kB in 7577 objects 2025-09-08 15:37:11.136 28216-30540 LeakCanary com.ahjswy.cn D │ Anonymous class implementing com.ahjswy.cn.utils.PDH$ProgressCallBack 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ this$0 instance of com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew with mDestroyed = true 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ OutDocAddMoreGoodsActByNew$1.this$0 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ╰→ com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Leaking: YES (ObjectWatcher was watching this because com.ahjswy.cn.ui.outgoods.OutDocAddMoreGoodsActByNew 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ received Activity#onDestroy() callback and Activity#mDestroyed is true) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Retaining 670.2 kB in 7576 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = fa9ac7f9-f278-4e6e-a567-cd47c2673793 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 58731 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 53730 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mApplication instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mEmbeddedApplication instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mBase instance of android.app.ContextImpl 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 6565 bytes retained by leaking objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D Signature: 9c5b257e00a0fb79337a2dea58c80c8eaad7bf09 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ┬─── 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ GC Root: Thread object 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ WV.md instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PathClassLoader↓ is not leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Thread name: 'CleanupReference' 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ Thread.contextClassLoader 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ dalvik.system.PathClassLoader instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PDH↓ is not leaking and A ClassLoader is never leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ ClassLoader.runtimeInternalObjects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ java.lang.Object[] array 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (PDH↓ is not leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ Object[1079] 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ com.ahjswy.cn.utils.PDH class 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: NO (a class is never leaking) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ static PDH.toastImage 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ├─ android.widget.ImageView instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Leaking: UNKNOWN 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ Retaining 7.4 kB in 47 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View not part of a window view hierarchy 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mAttachInfo is null (view detached) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mID = R.id.iv_toast 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ View.mWindowAttachCount = 2 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ mContext instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ↓ View.mParent 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D │ ~~~~~~~ 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ╰→ android.widget.LinearLayout instance 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Leaking: YES (ObjectWatcher was watching this because android.widget.LinearLayout received 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View#onDetachedFromWindow() callback) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ Retaining 6.6 kB in 64 objects 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 8b7a1cc5-96cd-4467-acd3-16fc8e25c74b 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 5615 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 549 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 0ce6e4a7-146d-4735-ac6f-42c56ddd8ac4 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ key = 9da710dc-d301-46c1-9bc8-7985fff8c621 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ watchDurationMillis = 21453 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ retainedDurationMillis = 16452 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View not part of a window view hierarchy 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View.mAttachInfo is null (view detached) 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ View.mWindowAttachCount = 2 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ​ mContext instance of com.ahjswy.cn.app.MyApplication 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 0 LIBRARY LEAKS 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D A Library Leak is a leak caused by a known bug in 3rd party code that you do not have control over. 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D See https://square.github.io/leakcanary/fundamentals-how-leakcanary-works/#4-categorizing-leaks 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 0 UNREACHABLE OBJECTS 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D An unreachable object is still in memory but LeakCanary could not find a strong reference path 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D from GC roots. 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D ==================================== 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D METADATA 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.137 28216-30540 LeakCanary com.ahjswy.cn D Please include this in bug reports and Stack Overflow questions. 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Build.VERSION.SDK_INT: 34 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Build.MANUFACTURER: Xiaomi 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D LeakCanary version: 2.12 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D App process name: com.ahjswy.cn 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Class count: 29261 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Instance count: 302994 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Primitive array count: 190945 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Object array count: 35651 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Thread count: 67 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap total bytes: 41270991 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Bitmap count: 338 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Bitmap total bytes: 24534146 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Large bitmap count: 0 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Large bitmap total bytes: 0 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 1: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 2: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 3: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 4: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 5: open /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 6: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 7: open /data/user/0/com.ahjswy.cn/databases/bugly_db_ 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 8: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 9: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 10: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 11: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 12: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 13: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Db 14: closed /data/user/0/com.ahjswy.cn/databases/fields.db 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Stats: LruCache[maxSize=3000,hits=145979,misses=256357,hitRate=36%] 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D RandomAccess[bytes=14567145,reads=256357,travel=114319837516,range=40190063,size=58168636] 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump reason: 5 retained objects, app is visible 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Analysis duration: 44549 ms 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump file path: /storage/emulated/0/Download/leakcanary-com.ahjswy.cn/2025-09-08_15-36-17_238.hprof 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump timestamp: 1757317030950 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D Heap dump duration: 3674 ms 2025-09-08 15:37:11.138 28216-30540 LeakCanary com.ahjswy.cn D ====================================
09-09
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值