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