在纯Java中,可以使用工具和Java代理在运行时处替换方法的主体。
毫无疑问java.lang.instrument.Instrumentation
在Android上不可用。
我已经检查了所有其他替代方法,例如stackoverflow中所述的替代方法,该替代方法用于过时的javassist-android实现。令人惊讶地有效,但仅适用于新课程。
还有一篇名为Hot swapping code in Android的文章,描述了如何在运行时再次加载类,而不是替换现有的类方法。
唯一涉及此问题的文章是名为Android hacking: replacing system classes methods with your own的文章,该文章缺少源代码,并且引用了Dalvik,而不是ART(因此它不适用于现代硬件)。
那么,有什么办法吗?
...
底线:我想要这样做的原因是在我的应用程序中跟踪特定于 方法的调用,就像调用此方法时一样(并在此方法之前执行一些操作)以及何时退出此方法(并对其执行一些操作)。这些方法是在运行时定义的,因此无法在编译时预先知道它们。
答案 0 :(得分:1)
Apply Changes是Android Studio 3.5的一项新功能,其基本功能与您要实现的功能类似:
” ..我们依赖于Android支持的运行时检测 8.0(Oreo)和较新的设备和仿真器来实时重新定义类。”
此外,在episode 108 of ADB Podcast的Esteban de la Canal中提到:
“ ..在Android Oreo(8.0)中,平台实现了字节码 即时进行检测,因此我们实际上可以更改dexed类 基本上通过附加相当于 JVMTI在Java中,因此我们可以附加一个代理说:您可以交换吗 这个班这个。
首先阅读art/openjdkjvmti资料,即readme记录以下内容:
openjdkjvmti插件
这是JVMTI v1.2的部分实现 android runtime作为插件的接口。这允许使用 可以通过修改来修改程序的运行状态的代理 内存中的dex文件并在全局上执行其他操作 运行时状态。
释放Android Studio 3.5的源代码后,请查看它们如何在应用更改实现中使用这些新API。
答案 1 :(得分:0)
尽管jlinstrument API从未添加到android,用于实现它们的底层JVMTI API却添加到了Android O中。例如,这是一个测试JVMTI代理,它将重新定义列出的类并在开头添加一个nop每种方法:https://android.googlesource.com/platform/art/+/refs/heads/master/tools/jvmti-agents/simple-force-redefine/