像
android.os.Looper
这样的系统类的字节码只是一个存根。例如,来自 android.os.Looper.loop()
的 android.jar
包含以下字节码:
public static final void loop();
Code:
0: new #2; //class java/lang/RuntimeException
3: dup
4: ldc #3; //String Stub!
6: invokespecial #4; //Method java/lang/RuntimeException."<init>":(Ljava/lang/String;)V
9: athrow
但是在 AOSP 中,我可以看到执行消息调度的真正源代码(参见
AOSP_ROOT/frameworks/base/core/java/android/os/Looper.java
)。那么android系统到底是如何处理这个类的呢?真正的代码是在将系统android.jar
编译成dex文件时修补的还是在Dalvik VM中运行时发生的?
您编译代码所针对的
android.jar
仅包含具有公共(常量)字段和公共方法的公共类,但所有这些方法都不包含任何实现。除了 void
之外,所有具有返回类型的方法都会抛出“Stub!” RuntimeException
。
具有实际实现的运行时库仅在电话设备或模拟器中与您的应用程序链接。