【问题标题】:android system class compilationandroid系统类编译
【发布时间】:2012-04-08 17:24:53
【问题描述】:

android.os.Looper 这样的系统类的字节码只是一个存根。例如,来自android.jarandroid.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 中运行时发生?

【问题讨论】:

    标签: java android compiler-construction dalvik


    【解决方案1】:

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

    具有实际实现的运行时库仅在电话设备或模拟器中与您的应用程序链接。

    【讨论】:

    • 你的意思是android.jar中没有一个类包含真正的代码,只有一堆存根让javac开心?我在哪里可以找到运行时库(源代码和字节码)?
    • 是的,它只是一个模拟 jar 来满足您对 android API 的编译时依赖。据我所知,如果没有真正的 Android 设备或模拟器,你就无法获得一个可以工作的 jar,因为它依赖于一些本机功能。
    • 至于源代码,您可以在这里浏览例如:grepcode.com/project/repository.grepcode.com/java/ext/… 或者您可以通过 Eclipse 中的 Android SDK Manager 直接下载它。它位于 API15 节点下,但它适用于安装的任何旧 API 版本。
    猜你喜欢
    • 2014-10-08
    • 2011-12-10
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 2020-06-23
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多