我-Xbootclasspath
在 Java 中进行试验只是为了好玩,并添加了一个测试方法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
某种方式覆盖引导类路径以及从哪里加载核心类?
编辑1:
它可能会起作用,但 Android Dalvik VM 确实依赖于所有新的 Dalvik VM 进程所派生的 zygote,因此 zygote 不能使用替代引导类路径运行。至少,这是我从这个问题中理解的:How to pass dalvik command line parameters through .apk?