2020-10-26(对Dex文件的理解)
Dex文件介紹
Android系統(tǒng)中,一個App的所有代碼都在一個Dex文件里面。Dex是一個類似Jar的存儲了多有Java編譯字節(jié)碼的歸檔文件。
為什么要使用dex文件來存儲呢?
Java源碼經(jīng)過編譯后,得到很多個class文件,考慮到手機(jī)的內(nèi)存較小,google改進(jìn)了字節(jié)碼的組織形式,將一個app中的所有class文件合到了一起構(gòu)成dex文件,當(dāng)然并不是簡單的拼接在一起,而是遵從dex的格式重新組織。
在dex中各個類能夠共享數(shù)據(jù),在一定程度上降低了冗余,同時也是文件結(jié)構(gòu)更加緊湊,實驗表明,dex文件是傳統(tǒng)jar文件大小的50%左右。
dex文件最終會和資源文件等一起打包成為apk,簽名后安裝到手機(jī)上。
Java文件編譯成Dex文件
Java文件編程成dex文件,要經(jīng)歷以下幾個步驟:
Java文件生成.class文件。
.class文件生成dex文件。
Java文件是Java的源文件。
.class文件是Java的字節(jié)碼文件,它可以被JVM識別、加載和執(zhí)行。
我們想要生成dex文件,第一步是要把Java文件編譯成.class文件,也就是字節(jié)碼文件。
生成.class文件的方式,Android和Java并無不同,都可以使用javac類生成:
// 打開命令行窗口,輸入如下命令,即可將.java文件編譯成.class文件 javac -source 1.7 -target 1.7 Demo.java生成.class文件之后,就需要我們轉(zhuǎn)換成dex文件了。
這一步是通過Android提供的工具包充的dx工具來實現(xiàn)的。
dx工具是Android源碼的一部分,其路徑是在out目錄下,因此在執(zhí)行dx之前,可以將該工具添加到PATH路徑。
示例:
//進(jìn)入dx所在目錄,.class文件復(fù)制到該目錄下,命令行執(zhí)行命令: dx --dex --output demo.dex Demo.classdex文件的執(zhí)行
打包成.apk文件,安裝運(yùn)行
通常情況下我們的dex文件會通過apkbuilder工具,將所有沒有編譯過的資源(eg: images)、編譯過的資源和.dex文件打包到最終的.apk文件中去。
打包成.apk文件之后,會對Apk文件簽名,apk文件只有被簽名才能被安裝在設(shè)備上。
另外,在生成最終apk之前,打包器會使用zipalign工具對應(yīng)用進(jìn)行優(yōu)化,位于android-sdk/tools目錄下。
最終,.apk文件將會運(yùn)行在Android系統(tǒng)上。
dalvikvm工具
dalvikvm工具,可以直接運(yùn)行.dex文件中的代碼,而不必通過.apk的形式安裝運(yùn)行。
dalvikvm的作用就是創(chuàng)建一個虛擬機(jī)并執(zhí)行指定參數(shù)中的java類。
我們用一個示例來看如何使用?
1.dex文件生成,這里指定生成產(chǎn)物為demo.jar
dx --dex --output=demo.jar Demo.class2.將demo.jar 通過adb push到/data/app目錄,并使用dalvikvm工具來執(zhí)行Demo類:
adb push demo.jar /data/app adb shell cd /data/app dalvikvm -cp demo.jar Demo總結(jié)
以上是生活随笔為你收集整理的2020-10-26(对Dex文件的理解)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020-10-26(安卓逆向开篇)
- 下一篇: 2020-10-27(左值和右值)