Android系统类编译

3

系统类(如android.os.Looper)的字节码只是一个存根。例如,android.jar 中的 android.os.Looper.loop() 包含以下字节码:

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运行时发生的?

1个回答

3
你编译代码所用的android.jar仅包含公共类、公共(常量)字段和公共方法,但所有这些方法都没有实现。除了返回类型为void的方法外,所有其他返回类型的方法都会抛出“Stub!”RuntimeException
只有在手机设备或模拟器中才会将带有真正实现的运行时库与应用程序链接。

你的意思是说android.jar中没有任何真正的代码,只有一堆存根来让javac编译通过?我在哪里可以找到运行时库(包括源代码和字节码)? - dacongy
是的,这只是一个模拟的jar包,用于满足您在编译时对Android API的依赖。据我所知,如果没有真正的Android设备或模拟器,您无法获得可工作的jar包,因为它依赖于一些本地功能。 - Natix
关于源代码,您可以在此处浏览示例:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 或者您可以通过Eclipse中的Android SDK Manager直接下载它。它位于API15节点下,但它适用于安装了任何旧版本API的情况。 - Natix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接