Миграция из Leakcanary 1. * в 2. * Преобразование LeakTrace в StackTrace - PullRequest
0 голосов
/ 01 мая 2020

Я пытаюсь перейти с LeakCanary версии 1. * на версию 2. * в первой версии был AnalysisResult.leakTraceAsFakeException, но теперь я не могу найти похожее поведение, которое застрял после создания своего пользовательского исключения FakeException но я не могу преобразовать LeakTrace в StackTrace Я перехожу по этой ссылке , но я не использую BugSnag в своем приложении

1 Ответ

1 голос
/ 01 мая 2020

Эта возможность была удалена из LeakCanary 2, но вы можете воссоздать ее для своих собственных нужд. См. Код в LeakCanary 1.6: https://github.com/square/leakcanary/blob/v1.6.3/leakcanary-analyzer/src/main/java/com/squareup/leakcanary/AnalysisResult.java#L104 -L133

public @NonNull RuntimeException leakTraceAsFakeException() {
  if (!leakFound) {
    throw new UnsupportedOperationException(
        "leakTraceAsFakeException() can only be called when leakFound is true");
  }
  LeakTraceElement firstElement = leakTrace.elements.get(0);
  String rootSimpleName = classSimpleName(firstElement.className);
  String leakSimpleName = classSimpleName(className);

  String exceptionMessage = leakSimpleName
      + " leak from "
      + rootSimpleName
      + " (holder="
      + firstElement.holder
      + ", type="
      + firstElement.type
      + ")";
  RuntimeException exception = new RuntimeException(exceptionMessage);

  StackTraceElement[] stackTrace = new StackTraceElement[leakTrace.elements.size()];
  int i = 0;
  for (LeakTraceElement element : leakTrace.elements) {
    String methodName = element.referenceName != null ? element.referenceName : "leaking";
    String file = classSimpleName(element.className) + ".java";
    stackTrace[i] = new StackTraceElement(element.className, methodName, file, 42);
    i++;
  }
  exception.setStackTrace(stackTrace);
  return exception;
} 

Самое большое различие между 1,6 и 2 состоит в том, что результат анализа, в котором использовалась одна трассировка утечки (=>, преобразуется в одну stacktrace), но теперь LeakCanary может находить много утечек одновременно, поэтому в результате анализа будет несколько утечек, вам нужно будет создать трассировку стека для каждого.

...