LeakCanary是一个Square开源的内存泄漏分析工具,如果检测到某个activity有内存泄漏,LeakCanary就会自动显示一个通知。
2.1)在app下的build.gradle中加入以下依赖
dependencies { debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.4' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.4' }
2.2)在Application类中进行初始化,可以直接检测Activity的内存泄露情况
public class ExampleApplication extends Application { @Override public void onCreate() { super.onCreate(); LeakCanary.install(this); } }
2.3)需要检测更多object时,可以通过RefWatcher
public class ExApplication extends Application { private RefWatcher mRefWatcher; @Override public void onCreate() { super.onCreate(); mRefWatcher = setupLeakCanary(); } private RefWatcher setupLeakCanary() { if (LeakCanary.isInAnalyzerProcess(this)) { return RefWatcher.DISABLED; } return LeakCanary.install(this); } public static RefWatcher getRefWatcher(Context context) { ExApplication leakApplication = (ExApplication) context.getApplicationContext(); return leakApplication.mRefWatcher; } } ExApplication.getRefWatcher(this).watch(obj); // RefWatcher是线程安全的,可以从任何线程调用,但obj不能为null。
3.1)在2.2中 直接install后即可检测Activity的原因
public static RefWatcher install(Application application) { return refWatcher(application).listenerServiceClass(DisplayLeakService.class) .excludedRefs(AndroidExcludedRefs.createAppDefaults().build()) .buildAndInstall(); }
在install的 buildAndInstall 方法中会根据application来创建ActivityRefWatch,以检测Activity的生命周期,在onActivityDestroyed时,依然是使用refWatcher.wath(activity),所以其实是一样的。
3.2)KeyedWeakReference 继承自 WeakReference,同时还会针对每个引用记录唯一的key。
3.3)DISABLED的定义:
public static final RefWatcher DISABLED = new RefWatcherBuilder<>().build();
debug中使用的源码在 leakcanary-android,release中使用的源码在 leakcanary-android-no-op. DISABLED中返回的方法
3.4)LeakCanary实际上就是在本机自动做Heap dump,然后对生成的hprof文件进行分析,进行结果展示,和手工分析MAT步骤基本一致。
RefWatcher.watch() 方法中根据要监控的对象创建一个KeyedWeakReference 2.在后台线程中检查引用是否被清除,如果没有,则调用GC 如果引用仍未被清除,说明内存泄露了,则导出.hprof文件到app的文件系统目录下 HeapAnalyzerService启动单独的进程,HeapAnalyzer使用HAHA来解析.hprof文件 HeapAnalyzer根据唯一的reference key查找 KeyedWeakReference定位内存泄露 HeapAnalyzer 计算 KeyedWeakReference 所引用对象的最短强引用路径,并确定是否泄露,构建导致泄露的对象引用链 将引用链传递回运行在APP进程中的 DisplayLeakService,并以通知的形式展示出来Activity、Fragment、Bitmap、其他具有生命周期的对象、可能持有较大内存占用的对象等。
内存泄漏就是某个对象在理应释放的时候却被其他对象持有,而没有被释放,因此造成内存泄漏。因此监控需要放在对象(很快)被释放的时候,比如Activity和Fragment的onDestroy方法中。
9.1)Lint (是Android Studio自带的静态代码分析工具,Analyze -> Inspect Code)
可以直接对单个文件或整个模块进行分析,以性能为例:
Android Lint: Performance Do not place Android context classes in static fields; this is a memory leak (and also breaks instant Run)
如对本文有疑问, 点击进行留言回复!!
android:screenOrientation=“portrait“ 一直警告报红
Codeforces C. A Cookie for You (模拟 / 分类 / 贪心) (Round #654 Div.2)
DialogFragment弹窗(带黑色透明背景和不带黑色透明背景)
网友评论