1

-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?

4

0 回答 0