前面我们已经了解到Resource Canary泄漏对象查找的逻辑,并且了解了在找到泄漏对象后,通过BaseLeakProcessor的各个实现子类来进行不同的处理策略,接下来我们来分别看下各子类的实现。
AutoDumpProcessor
AutoDumpProcessor的代码比较简单,如下所示:
public class AutoDumpProcessor extends BaseLeakProcessor {
private static final String TAG = "Matrix.LeakProcessor.AutoDump";
public AutoDumpProcessor(ActivityRefWatcher watcher) {
super(watcher);
}
@Override
public boolean process(DestroyedActivityInfo destroyedActivityInfo) {
final File hprofFile = getHeapDumper().dumpHeap(true);
if (hprofFile != null) {
getWatcher().markPublished(destroyedActivityInfo.mActivityName);
getWatcher().triggerGc();
final HeapDump heapDump = new HeapDump(hprofFile, destroyedActivityInfo.mKey, destroyedActivityInfo.mActivityName);
getHeapDumpHandler().process(heapDump);
} else {
MatrixLog.i(TAG, "heap dump for further analyzing activity with key [%s] was failed, just ignore.",
destroyedActivityInfo.mKey);
}
return true;
}
}
可以看到其实现比较简单,主要是通过getHeapDumper()返回的对象进行操作,其中getHeapDumper().dumpHeap是生成内存快照,getHeapDumpHandler().process是解析内存快照,由于该类中没有定义getHeapDumper()和getHeapDumpHandler()方法,不难想到该能力由父类提供默认实现,在BaseLeakProcessor中的默认实现如下:
@Deprecated
public AndroidHeapDumper getHeapDumper() {
if (mHeapDumper == null) {
mHeapDumper = new AndroidHeapDumper(mWatcher.getContext());
}
return mHeapDumper;
}
protected AndroidHeapDumper.HeapDumpHandler getHeapDumpHandler() {
if (mHeapDumpHandler == null) {
mHeapDumpHandler = new AndroidHeapDumper.HeapDumpHandler() {
@Override
public void process(HeapDump result) {
CanaryWorkerService.shrinkHprofAndReport(mWatcher.getContext(), result);
}
};
}
return mHeapDumpHandler;
}
getHeapDumper().dumpHeap
结合代码可以看到该方法实现执行的是AndridHeapDumper的dumpHeap方法,代码如下:
从代码可以看出,这里主要是通过Debug.dumpHprofData来生成hprof文件,与LeakCanary实现原理一致。
getHeapDumpHandler().process
结合代码可以看到该方法得到的是HeapDumpHandler接口的实现类,这里在代码中是一个匿名类,在该类的process方法中,调用CanaryWorkerService的shrinkHprofAndReport去处理hprof文件。
CanaryWorkerService.shrinkHprofAndReport
结合代码可以看到主要是将hprof文件裁剪后打包成zip文件,交由reportHprofResult处理,最终回调到PluginListener的onReportIssue方法中,由应用开发者决定如何处理hprof文件。