我正在尝试使用Java中的-Xbootclasspath
只是为了好玩,并添加了一个测试方法int java.lang.Object#id()
,只是一个类似实例的identityHashCode
方法快捷方式:
package java.lang;
public class Object {
public final int id() {
return System.identityHashCode(this);
}
// the original code goes here
}
上面的代码被编译成单个类的JAR文件,下面的代码被编译并依赖于补丁JAR文件,因此以下代码是合法的:
public static void main(final String... args) {
System.out.println(new Object().id());
}
在引导类之前运行示例应用程序非常容易:
$ java -Xbootclasspath/p:patch.jar -cp app.jar test.Application
366712642
工作正常。现在,我想知道是否有可能在Android上做同样的技巧。所以,我认为最接近的等价物应该是(来自adb shell
):
$ dalvikvm -Xbootclasspath:patch.jar -cp app.jar test.Application
java.lang.NoSuchMethodError: No virtual method id()I in class Ljava/lang/Object; or its super classes (declaration of 'java.lang.Object' appears in /syework/core-libart.jar)
at test.Application.main(Application.java:11)
看起来像前置,但没有工作,因为它说java.lang.Object
类已经在另一个位置定义了(可能真正的路径是/system/framework/core-libart.jar
,至少它说的类似,但JAR是相当的不同 - 毕竟怎么样?)。我还看到了$BOOTCLASSPATH
变量的一些示例,但由于某些原因,它们都不适用于我。
是否可以以某种方式运行dalvikvm
覆盖bootclass路径以及从哪里加载核心类?
编辑1:
它可能会起作用,但Android Dalvik VM实际上依赖于所有新的Dalvik VM进程分叉的受精卵,因此受精卵不会使用其他引导类路径运行。至少,这是我从这个问题中理解的:How to pass dalvik command line parameters through .apk?