public static String leakInfo(Context context, HeapDump heapDump, AnalysisResult result,
boolean detailed) {
PackageManager packageManager = context.getPackageManager();
String packageName = context.getPackageName();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
String info = "In " + packageName + ":" + packageInfo.versionName + ":" + packageInfo
.versionCode + ".\n";
String detailedString = "";
if (result.leakFound) {
if (result.excludedLeak) {
info = info + "* LEAK CAN BE IGNORED.\n";
}
info = info + "* " + result.className;
if (!heapDump.referenceName.equals("")) {
info = info + " (" + heapDump.referenceName + SocializeConstants.OP_CLOSE_PAREN;
}
info = info + " has leaked:\n" + result.leakTrace.toString() + "\n";
if (detailed) {
detailedString = "\n* Details:\n" + result.leakTrace.toDetailedString();
}
} else {
info = result.failure != null ? info + "* FAILURE:\n" + Log.getStackTraceString
(result.failure) + "\n" : info + "* NO LEAK FOUND.\n\n";
}
return info + "* Reference Key: " + heapDump.referenceKey + "\n" + "* Device: " +
Build.MANUFACTURER + " " + Build.BRAND + " " + Build.MODEL + " " + Build
.PRODUCT + "\n" + "* Android Version: " + VERSION.RELEASE + " API: " +
VERSION.SDK_INT + " LeakCanary: " + BuildConfig.LIBRARY_VERSION + "\n" + "* " +
"Durations: watch=" + heapDump.watchDurationMs + "ms, gc=" + heapDump
.gcDurationMs + "ms, heap dump=" + heapDump.heapDumpDurationMs + "ms, " +
"analysis=" + result.analysisDurationMs + "ms" + "\n" + detailedString;
} catch (NameNotFoundException e) {
throw new RuntimeException(e);
}
}