@Override protected final void onHandleIntentInForeground(@Nullable Intent intent) { if (intent == null) { CanaryLog.d("AbstractAnalysisResultService received a null intent, ignoring."); return; } if (!intent.hasExtra(ANALYZED_HEAP_PATH_EXTRA)) { onAnalysisResultFailure(getString(R.string.leak_canary_result_failure_no_disk_space)); return; } File analyzedHeapFile = new File(intent.getStringExtra(ANALYZED_HEAP_PATH_EXTRA)); AnalyzedHeap analyzedHeap = AnalyzedHeap.load(analyzedHeapFile); if (analyzedHeap == null) { onAnalysisResultFailure(getString(R.string.leak_canary_result_failure_no_file)); return; } try { onHeapAnalyzed(analyzedHeap); } finally { //noinspection ResultOfMethodCallIgnored analyzedHeap.heapDump.heapDumpFile.delete(); //noinspection ResultOfMethodCallIgnored analyzedHeap.selfFile.delete(); } }
@Override protected void onHandleIntentInForeground(@Nullable Intent intent) { if (intent == null) { CanaryLog.d("HeapAnalyzerService received a null intent, ignoring."); return; } String listenerClassName = intent.getStringExtra(LISTENER_CLASS_EXTRA); HeapDump heapDump = (HeapDump) intent.getSerializableExtra(HEAPDUMP_EXTRA); HeapAnalyzer heapAnalyzer = new HeapAnalyzer(heapDump.excludedRefs, this, heapDump.reachabilityInspectorClasses); AnalysisResult result = heapAnalyzer.checkForLeak(heapDump.heapDumpFile, heapDump.referenceKey, heapDump.computeRetainedHeapSize); AbstractAnalysisResultService.sendResultToListener(this, listenerClassName, heapDump, result); }
/** * Called after a heap dump is analyzed, whether or not a leak was found. * In {@link AnalyzedHeap#result} check {@link AnalysisResult#leakFound} and {@link * AnalysisResult#excludedLeak} to see if there was a leak and if it can be ignored. * <p> * This will be called from a background intent service thread. * <p> * It's OK to block here and wait for the heap dump to be uploaded. * <p> * The analyzed heap file and heap dump file will be deleted immediately after this callback * returns. */ protected void onHeapAnalyzed(@NonNull AnalyzedHeap analyzedHeap) { onHeapAnalyzed(analyzedHeap.heapDump, analyzedHeap.result); }
@Override protected final void onAnalysisResultFailure(String failureMessage) { super.onAnalysisResultFailure(failureMessage); String failureTitle = getString(R.string.leak_canary_result_failure_title); showNotification(null, failureTitle, failureMessage); }
@Override protected final void onHandleIntent(Intent intent) { HeapDump heapDump = (HeapDump) intent.getSerializableExtra(HEAP_DUMP_EXTRA); AnalysisResult result = (AnalysisResult) intent.getSerializableExtra(RESULT_EXTRA); try { onHeapAnalyzed(heapDump, result); } finally { //noinspection ResultOfMethodCallIgnored heapDump.heapDumpFile.delete(); } }
@Override protected void onHandleIntent(Intent intent) { String listenerClassName = intent.getStringExtra(LISTENER_CLASS_EXTRA); HeapDump heapDump = (HeapDump) intent.getSerializableExtra(HEAPDUMP_EXTRA); ExcludedRefs androidExcludedDefault = createAndroidDefaults().build(); HeapAnalyzer heapAnalyzer = new HeapAnalyzer(androidExcludedDefault, heapDump.excludedRefs); AnalysisResult result = heapAnalyzer.checkForLeak(heapDump.heapDumpFile, heapDump.referenceKey); AbstractAnalysisResultService.sendResultToListener(this, listenerClassName, heapDump, result); } }