feat: cof experiments

This commit is contained in:
rhunk
2024-05-30 23:59:55 +02:00
parent 5d5a067319
commit d28733275b
6 changed files with 85 additions and 47 deletions

View File

@@ -36,6 +36,7 @@ class ClassMapper(
OperaViewerParamsMapper(),
MemoriesPresenterMapper(),
StreaksExpirationMapper(),
COFObservableMapper(),
)
}

View File

@@ -0,0 +1,34 @@
package me.rhunk.snapenhance.mapper.impl
import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
import me.rhunk.snapenhance.mapper.AbstractClassMapper
import me.rhunk.snapenhance.mapper.ext.getClassName
class COFObservableMapper: AbstractClassMapper("COFObservable") {
val classReference = classReference("class")
val getBooleanObservable = string("getBooleanObservable")
init {
mapper {
for (classDef in classes) {
if (classDef.interfaces.isEmpty()) continue
if (classDef.methods.none { it.name == "dispose" }) continue
val getBooleanObservableDexMethod = classDef.methods.firstOrNull { method ->
method.parameterTypes.size == 2 &&
method.parameterTypes[0] == "Ljava/lang/String;" &&
getClass(method.returnType)?.methods?.any { it.name == "mergeFrom" } == true
} ?: continue
if (getBooleanObservableDexMethod.implementation?.instructions?.any { instruction ->
instruction is Instruction35c && (instruction.reference as? MethodReference)?.name == "elapsedRealtime"
} == true) {
getBooleanObservable.set(getBooleanObservableDexMethod.name)
classReference.set(classDef.getClassName())
return@mapper
}
}
}
}
}