是否可以在Android上为Dalvik VM添加bootclasspath?

时间:2016-09-26 23:40:32

标签: java android dalvik bootclasspath

我正在尝试使用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?

0 个答案:

没有答案