2012-04-08 45 views
3

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

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内运行时是否发生了实际代码修补?

回答

3

您编译代码的android.jar仅包含具有public(常量)字段和公共方法的公共类,但所有这些方法都不包含实现。返回类型为void的所有方法都会抛出“Stub!” RuntimeException

具有真正实现的运行时库仅在电话设备或仿真器中与应用程序链接。

+0

您的意思是android.jar中的任何类都不包含真实代码,并且它只有一堆存根让javac快乐?我在哪里可以找到运行时库(源代码和字节码)? – dacongy 2012-04-08 17:56:57

+0

是的,它只是一个模拟jar来满足您对android API的编译时间依赖性。据我所知,如果没有真正的Android设备或模拟器,你就无法获得一个工作的jar包,因为它依赖于某些本地功能。 – Natix 2012-04-08 18:04:39

+0

至于来源,你可以在这里浏览它:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/,或者你可以直接通过Eclipse中的Android SDK管理器。它位于API15节点下,但可与任何旧版API安装在一起。 – Natix 2012-04-08 18:06:05