У LeakCanary есть обратный вызов? - PullRequest
0 голосов
/ 13 декабря 2018

Как я могу получить журнал LeakCanary или любые другие данные об утечке?Есть ли в LeakCanary какой-либо вид обратного вызова, который мы можем использовать, чтобы получить «утечку данных», чтобы что-то с ней сделать в то время, когда она произошла?Я хочу отправить данные в мой FireBase или другую БД.

Я искал в документации, но ничего не нашел по этому поводу.

Спасибо всем

1 Ответ

0 голосов
/ 13 декабря 2018

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>
...