首页 > 测试圈 >技术>详情

Android 内存泄漏之 RD 是如何检测-LeakCanary

时间:2016-01-28 13:45   作者:doctorq

 

内存泄露在普通功能测试中相对难以发现,但泄露到一定程度造成的 OOM (内存超出限制,应用被强退)会给用户带来很明显的 app 不稳定的感觉,因此必须加强监测。这次 doctorq 给我们介绍了 LeakCanary 这款能有效检测内存泄露的软件,Testerhome Android 官方客户端也有在用哦!

添加LeakCanary依赖包

在主模块app下的build.gradle下添加如下依赖:

debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1'

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

开启LeakCanary

添加Application子类

首先创建一个ExampleApplication,该类继承于Application,在该类的onCreate方法中添加如下代码开启LeakCanary监控:

LeakCanary.install(this);

在配置文件中注册ExampleApplication

AndroidManifest.xml中的application标签中添加如下信息:

android:name=".ExampleApplication"

这个时候安装应用到手机,会自动安装一个Leaks应用,如下图:

制造一个内存泄漏的点

建立一个ActivityManager类,单例模式,里面有一个数组用来保存Activity

  
然后在DetailActivity中的onCreate方法中将当前activity添加到ActivityManager的数组中:
我们从首页跳转到详情页的时候会进入DetailActivityonCreate的方法,然后就将当前activity添加到了数组中,当返回时,我们没把他从数组中删除。再次进入的时候,会创建新的activity 并添加到数组中,但是之前的activity仍然被引用,无法释放,但是这个activity不会再被使用,这个时候就造成了内存泄漏。我们来看看LeakCanary是如何报出这个问题的。
解析的过程有点耗时,所以需要等待一会才会在Leaks应用中,当我们点开某一个信息时,会看到详细的泄漏信息:
为了方便理解,小编补充解释一下上面的图说了啥:
com.example.android.sunshine.app app 的包名。
第一到第四行发生内存泄露的栈。从信息中可以看出是: ActivityManager -> container -> SparseArray -> Object[][0] ,即我们在 ActivityManager 类中 addActivity 方法使用的东西。

最后一行的 leaks DetailActivity instance :具体泄露的对象。很明确说明了是一个 DetailActivity 的实例。

参考资料:

square/leakcanary udacity/Sunshine-Version-2

            

  • 全部评论(4
用户名:游客     发布时间:2015年12月14日
very good
用户名:2411976021@qq.com     发布时间:2015年11月30日
TalkingData今日发布了《2014移动互联网数据报告》,报告显示,2014年,我国移动产业发展迅猛,移动智能终端设备数已达10.6亿,较2013年增长231.7%。
用户名:admin@admin.com     发布时间:2015年11月27日
2
用户名:admin@admin.com     发布时间:2015年11月27日
1


线