Java文件是如何編譯成Dex文件的?如何執行Dex文件?

Dex文件介紹


Android系統中,一個App的所有代碼都在一個Dex文件裏面。Dex是一個類似Jar的存儲了多有Java編譯字節碼的歸檔文件。

爲什麼要使用dex文件來存儲呢?

Java源碼經過編譯後,得到很多個class文件,考慮到手機的內存較小,google改進了字節碼的組織形式,將一個app中的所有class文件合到了一起構成dex文件,當然並不是簡單的拼接在一起,而是遵從dex的格式重新組織。

在dex中各個類能夠共享數據,在一定程度上降低了冗餘,同時也是文件結構更加緊湊,實驗表明,dex文件是傳統jar文件大小的50%左右。

dex文件最終會和資源文件等一起打包成爲apk,簽名後安裝到手機上。

Java文件編譯成Dex文件


Java文件編程成dex文件,要經歷以下幾個步驟:

  1. Java文件生成.class文件。
  2. .class文件生成dex文件。

1. Java文件生成.class文件

Java文件是Java的源文件。
.class文件是Java的字節碼文件,它可以被JVM識別、加載和執行。

我們想要生成dex文件,第一步是要把Java文件編譯成.class文件,也就是字節碼文件。

生成.class文件的方式,Android和Java並無不同,都可以使用javac類生成:

// 打開命令行窗口,輸入如下命令,即可將.java文件編譯成.class文件
javac -source 1.7 -target 1.7 Demo.java

2. .class文件生成Dex文件

生成.class文件之後,就需要我們轉換成dex文件了。

這一步是通過Android提供的工具包充的dx工具來實現的。

dx工具是Android源碼的一部分,其路徑是在out目錄下,因此在執行dx之前,可以將該工具添加到PATH路徑。

示例:

//進入dx所在目錄,.class文件複製到該目錄下,命令行執行命令:
dx --dex --output demo.dex Demo.class

dex文件的執行


打包成.apk文件,安裝運行

通常情況下我們的dex文件會通過apkbuilder工具,將所有沒有編譯過的資源(eg: images)、編譯過的資源和.dex文件打包到最終的.apk文件中去。

打包成.apk文件之後,會對Apk文件簽名,apk文件只有被簽名才能被安裝在設備上。

另外,在生成最終apk之前,打包器會使用zipalign工具對應用進行優化,位於android-sdk/tools目錄下。

最終,.apk文件將會運行在Android系統上。

dalvikvm工具

dalvikvm工具,可以直接運行.dex文件中的代碼,而不必通過.apk的形式安裝運行。

dalvikvm的作用就是創建一個虛擬機並執行指定參數中的java類。

我們用一個示例來看如何使用?

  1. dex文件生成,這裏指定生成產物爲demo.jar
dx --dex --output=demo.jar Demo.class
  1. 將demo.jar 通過adb push到/data/app目錄,並使用dalvikvm工具來執行Demo類:
adb push demo.jar /data/app
adb shell
cd /data/app
dalvikvm -cp demo.jar Demo
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章