如何在Android下交换方法主体

时间:2019-06-09 09:53:48

标签: android dalvik dex java-assist

在纯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(因此它不适用于现代硬件)。

那么,有什么办法吗?

...

底线:我想要这样做的原因是在我的应用程序中跟踪特定于 方法的调用,就像调用此方法时一样(并在此方法之前执行一些操作)以及何时退出此方法(并对其执行一些操作)。这些方法是在运行时定义的,因此无法在编译时预先知道它们。

2 个答案:

答案 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/