<lambda>null1 package shark
2
3 import com.github.ajalt.clikt.core.CliktCommand
4 import shark.SharkCliCommand.Companion.echo
5 import shark.SharkCliCommand.Companion.retrieveHeapDumpFile
6 import shark.SharkCliCommand.Companion.sharkCliParams
7 import java.io.File
8
9 class AnalyzeCommand : CliktCommand(
10 name = "analyze",
11 help = "Analyze a heap dump."
12 ) {
13
14 override fun run() {
15 val params = context.sharkCliParams
16 analyze(retrieveHeapDumpFile(params), params.obfuscationMappingPath)
17 }
18
19 companion object {
20 fun CliktCommand.analyze(
21 heapDumpFile: File,
22 proguardMappingFile: File?
23 ) {
24 val proguardMapping = proguardMappingFile?.let {
25 ProguardMappingReader(it.inputStream()).readProguardMapping()
26 }
27 val objectInspectors = AndroidObjectInspectors.appDefaults.toMutableList()
28
29 val listener = OnAnalysisProgressListener { step ->
30 SharkLog.d { "Analysis in progress, working on: ${step.name}" }
31 }
32
33 val heapAnalyzer = HeapAnalyzer(listener)
34 SharkLog.d { "Analyzing heap dump $heapDumpFile" }
35
36 val heapAnalysis = heapAnalyzer.analyze(
37 heapDumpFile = heapDumpFile,
38 leakingObjectFinder = FilteringLeakingObjectFinder(
39 AndroidObjectInspectors.appLeakingObjectFilters
40 ),
41 referenceMatchers = AndroidReferenceMatchers.appDefaults,
42 computeRetainedHeapSize = true,
43 objectInspectors = objectInspectors,
44 proguardMapping = proguardMapping,
45 metadataExtractor = AndroidMetadataExtractor
46 )
47 echo(heapAnalysis)
48 }
49 }
50 }
51