2012-04-08 73 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