/
AndroidMetadataExtractor.kt
36 lines (30 loc) · 1.33 KB
/
AndroidMetadataExtractor.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package shark
object AndroidMetadataExtractor : MetadataExtractor {
override fun extractMetadata(graph: HeapGraph): Map<String, String> {
val build = AndroidBuildMirror.fromHeapGraph(graph)
val leakCanaryVersion = readLeakCanaryVersion(graph)
val processName = readProcessName(graph)
return mapOf(
"Build.VERSION.SDK_INT" to build.sdkInt.toString(),
"Build.MANUFACTURER" to build.manufacturer,
"LeakCanary version" to leakCanaryVersion,
"App process name" to processName
)
}
private fun readLeakCanaryVersion(graph: HeapGraph): String {
val versionHolderClass = graph.findClassByName("leakcanary.internal.InternalLeakCanary")
return versionHolderClass?.get("version")?.value?.readAsJavaString() ?: "Unknown"
}
private fun readProcessName(graph: HeapGraph): String {
val activityThread = graph.findClassByName("android.app.ActivityThread")
?.get("sCurrentActivityThread")
?.valueAsInstance
val appBindData = activityThread?.get("android.app.ActivityThread", "mBoundApplication")
?.valueAsInstance
val appInfo = appBindData?.get("android.app.ActivityThread\$AppBindData", "appInfo")
?.valueAsInstance
return appInfo?.get(
"android.content.pm.ApplicationInfo", "processName"
)?.valueAsInstance?.readAsJavaString() ?: "Unknown"
}
}