如何使用 Java 反射调用 Android Dalvik 内部方法?

How to invoke an Android Dalvik internal method using Java reflection?

虽然也有类似的问题(比如this and this),但是他们的回答并没有解决我的问题

我正在使用 Android Studio 1.5.1 目标 Android API 18(在 Android KitKat 4.4 之前,所以我正在处理 Dalvik,而不是 ART运行时间)。

我的问题是:

(1) 是否可以使用反射调用Dalvik 内部方法?如果是这样,你能展示一个代码示例吗?比如Dalvik有自己的栈,在源码里here (Interpreter),我可以通过反射调用函数dvmDumpRunningThreadStack()吗?

(2) 如果 (1) 不可能,因为堆栈是用本机代码编写的,是否可以使用反射调用 any Dalvik 内部方法?如果是这样,你能展示一个代码示例吗?比如Dalvik有很多方法位于源代码here (Dalvik),我可以通过反射调用那里的任何方法吗?

这行不通。反射机制只知道如何找到 Java-language 代码可见的东西。

您可以调用托管代码可见但不属于 public API 的方法。 VM 的内部本机函数根本不可见,也没有用于查找它们的 VM 函数。所有要调用的 VM 函数都在 class.

中显式发布为 "native" 方法

首先Java中的反射只能得到一个java-level函数指针。其实质就是从对应的class对象中获取vtable。 所有的 dalvik 内部方法都位于 '/system/lib/'。您的代码位于“/data/app/”。

所以,我不认为你可以在运行时使用任何 dalvik 内部方法,除非你知道 libdvm.so 的地址和内部方法在动态库中的偏移量(例如 libdvm.so)。

如果您的 phone 在您构建的 rom 上是 运行,使用 objdump -D libdvm.so 获取偏移量并打印日志以找到 libdvm.so 的地址. 我认为这可能是工作。

: )