LeakCanary有回拨吗



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

我在文件中找了一下,但什么也没找到

感谢所有

TLDR;您需要扩展DisplayLeakService

https://github.com/square/leakcanary/wiki/Customizing-LeakCanary#uploading-对服务器

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

创建您自己的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>

我的解决方案有点不同(基于来自square的示例:https://square.github.io/leakcanary/recipes/#uploading-到布加勒斯特(,但想法是一样的。我们通过Timber使用Sentry和Firebase来记录内存泄漏。我发现哨兵日志记录更方便,因为它显示了我在内存泄漏之前所采取的确切步骤(屏幕打开,背景/前景(。

/**
* Helper class to record leak canary memory leak traces on Timber.
*/
class LeakCanaryService : OnHeapAnalyzedListener {
private val defaultLeakListener = DefaultOnHeapAnalyzedListener.create()
override fun onHeapAnalyzed(heapAnalysis: HeapAnalysis) {
// Delegate to default behavior (notification and saving result)
defaultLeakListener.onHeapAnalyzed(heapAnalysis)
when (heapAnalysis) {
is HeapAnalysisSuccess -> {
val allLeakTraces = heapAnalysis
.allLeaks
.toList()
.flatMap { leak ->
leak.leakTraces.map { leakTrace -> leak to leakTrace }
}
allLeakTraces.forEach { (leak, leakTrace: LeakTrace) ->
val exception = MemoryLeakReportingException(leak.shortDescription)
Timber.e(exception, "Memory leak recorded: ${exception.message}n$leakTrace")
}
}
is HeapAnalysisFailure -> {
// Please file any reported failure to
// https://github.com/square/leakcanary/issues
Timber.e(
heapAnalysis.exception,
"Memory leak analysis failed: ${heapAnalysis.exception.message}"
)
}
}
}
class MemoryLeakReportingException(message: String) : RuntimeException(message)
}

你在应用程序类中初始化这个类:

LeakCanary.config = LeakCanary.config.copy(
onHeapAnalyzedListener = LeakCanaryService()
)

最新更新