从Matrix-ResourceCanary看内存快照生成-AutoDumpProcessor

69 阅读1分钟

前面我们已经了解到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方法,代码如下:

image-20230823233104101

从代码可以看出,这里主要是通过Debug.dumpHprofData来生成hprof文件,与LeakCanary实现原理一致。

getHeapDumpHandler().process

结合代码可以看到该方法得到的是HeapDumpHandler接口的实现类,这里在代码中是一个匿名类,在该类的process方法中,调用CanaryWorkerService的shrinkHprofAndReport去处理hprof文件。

CanaryWorkerService.shrinkHprofAndReport

image-20230823233657445

结合代码可以看到主要是将hprof文件裁剪后打包成zip文件,交由reportHprofResult处理,最终回调到PluginListener的onReportIssue方法中,由应用开发者决定如何处理hprof文件。