官方文档地址
LeakCanary 中文使用说明 这个是2015年的翻译,版本比较旧,但是大体的东西还是可以用的,建议跟官方文档比较着看,避免出错。
本文主要讲述在项目中用到的自定义Leak的东西。
事情的经过是这样的:为了自测,在平时会跑一下Monkey测试,为了检测内存泄漏,就使用了Leak,但是Monkey有时候会手贱的把Leak信息给删除了,造成通知栏有多条泄漏信息,但是具体内容无法查看,所以这里手动把信息写入本地。
官方给的自定义方案
参考官方方案,这里写一下实现步骤。
注意:调试方法不能用到正式包,因为打包不会通过,主要原因就是你引入的依赖是区分debug和release的。所以不要加入代码版本控制中。
//新建application并继承你自己的application,然后在manifest中修改为这个。
public class DebugExampleApplication extends YourApplication{
@Override
protected RefWatcher installLeakCanary() {
// Build a customized RefWatcher
RefWatcher refWatcher = LeakCanary.refWatcher(this)
.listenerServiceClass(LeakUploadService.class)
.buildAndInstall();
return refWatcher;
}
}
//原来的application中,初始化改成如下:
if (LogUtils.DEBUG) {//调试开关
refWatcher = installLeakCanary();
// LeakCanary.install(this);
}
//添加如下方法:
protected RefWatcher installLeakCanary() {
return RefWatcher.DISABLED;
}
//LeakUploadService代码:
别忘了在manifest中注册:
<service android:name="sina.mobile.tianqitong.LeakUploadService" />
public class LeakUploadService extends DisplayLeakService {
@Override
protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
if (!result.leakFound || result.excludedLeak) {
return;
}
//写入操作
String newLeakInfo = leakInfo + "****************";
String fileName = "/sdcard/leak/leak.txt";
File file = new File(fileName);
try {
if (!file.exists()) {
file.createNewFile();
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(file));
bos.write(newLeakInfo.getBytes());
bos.close();
} else {
FileWriter fw = new FileWriter(fileName, true);
fw.write(newLeakInfo);
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}