LeakCanary是否有回调?

时间:2018-12-13 15:11:03

标签: android leakcanary

如何获取LeakCanary日志或有关泄漏的任何类型的数据? LeakCanary是否具有任何类型的Callback,我们可以用来获取“泄漏数据”以在发生时对其进行处理? 我想将数据发送到FireBase或其他数据库。

我在文档中进行了搜索,但没有发现任何东西。

感谢所有人

1 个答案:

答案 0 :(得分:2)

TLDR;您需要扩展 DisplayLeakService

https://github.com/square/leakcanary/wiki/Customizing-LeakCanary#uploading-to-a-server

您可以更改默认行为,以将泄漏跟踪和堆转储上传到您选择的服务器。

创建自己的AbstractAnalysisResultService。最简单的方法是在调试源中扩展DisplayLeakService:

public class LeakUploadService extends DisplayLeakService {
  @Override protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
    if (!result.leakFound || result.excludedLeak) {
      return;
    }
    if (result.leakFound) {
      uploadLeakToServer(result, leakInfo);
    }
  }

  private void uploadLeakToServer(AnalysisResult result, String leakInfo) {
    // TODO Upload result to server
  }
}

您可以使用AnalysisResult.leakTraceAsFakeException()将泄漏跟踪转换为伪造的异常,然后将其上传到崩溃报告后端。使用Bugsnag的方法如下:

public class LeakUploadService extends DisplayLeakService {

  @Override protected void afterDefaultHandling(HeapDump heapDump, AnalysisResult result, String leakInfo) {
    if (!result.leakFound || result.excludedLeak) {
      return;
    }
    if (result.leakFound) {
      uploadLeakToServer(result, leakInfo);
    }
  }

  private void uploadLeakToServer(AnalysisResult result, String leakInfo) {
    Client bugsnagClient = new Client(getApplication(), "YOUR_BUGSNAG_API_KEY", false);
    bugsnagClient.setSendThreads(false);
    bugsnagClient.beforeNotify(error -> {
      // Bugsnag does smart grouping of exceptions, which we don't want for leak traces.
      // So instead we rely on the SHA-1 of the stacktrace, which has a low risk of collision.
      String stackTraceString = Logs.getStackTraceString(error.getException());
      String uniqueHash = Strings.createSHA1Hash(stackTraceString);
      error.setGroupingHash(uniqueHash);
      return true;
    });

    MetaData metadata = new MetaData();
    metadata.addToTab("LeakInfo", "LeakInfo", leakInfo);
    bugsnagClient.notifyBlocking(result.leakTraceAsFakeException(), Severity.ERROR, metadata);
  }
}

接下来,您需要在LeakCanary中指定侦听器服务类:

public class DebugExampleApplication extends ExampleApplication {
  @Override protected void installLeakCanary() {
    RefWatcher refWatcher = LeakCanary.refWatcher(this)
      .listenerServiceClass(LeakUploadService.class);
      .buildAndInstall();
  }
}

别忘了在调试的AndroidManifest.xml中注册该服务:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    >
  <application android:name="com.example.DebugExampleApplication">
    <service android:name="com.example.LeakUploadService" />
  </application>
</manifest>