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文件,要經歷以下幾個步驟:
- Java文件生成.class文件。
- .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類。
我們用一個示例來看如何使用?
- dex文件生成,這裏指定生成產物爲demo.jar
dx --dex --output=demo.jar Demo.class
- 將demo.jar 通過adb push到/data/app目錄,並使用dalvikvm工具來執行Demo類:
adb push demo.jar /data/app
adb shell
cd /data/app
dalvikvm -cp demo.jar Demo