xref: /aosp_15_r20/external/leakcanary2/shark-android/src/main/java/shark/AndroidServices.kt (revision d9e8da70d8c9df9a41d7848ae506fb3115cae6e6)

<lambda>null1 package shark
2 
3 object AndroidServices {
4   val HeapGraph.aliveAndroidServiceObjectIds: List<Long>
5     get() {
6       return context.getOrPut(AndroidServices::class.java.name) {
7         val activityThreadClass = findClassByName("android.app.ActivityThread")!!
8         val currentActivityThread = activityThreadClass
9           .readStaticField("sCurrentActivityThread")!!
10           .valueAsInstance!!
11 
12         val mServices = currentActivityThread["android.app.ActivityThread", "mServices"]!!
13           .valueAsInstance!!
14 
15         val servicesArray = mServices["android.util.ArrayMap", "mArray"]!!.valueAsObjectArray!!
16 
17         servicesArray.readElements()
18           .filterIndexed { index, heapValue ->
19             // ArrayMap<IBinder, Service>
20             // even: key, odd: value
21             index % 2 == 1
22               && heapValue.isNonNullReference
23           }
24           .map { it.asNonNullObjectId!! }
25           .toList()
26       }
27     }
28 }