1

私は-Xbootclasspath楽しみのためにJavaで実験しておりint java.lang.Object#id()、インスタンスのようなidentityHashCodeメソッドのショートカットである test method を追加しました:

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で同じトリックを行うことができるかどうか疑問に思っています. したがって、最も近いものは次のようになると思います (from 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