1. 程式人生 > >java檔案,class檔案與dex檔案的轉化。(詳細教程)

java檔案,class檔案與dex檔案的轉化。(詳細教程)

筆者這兩天整理的關於安卓逆向的一些小知識:教你如何在這三種檔案中來去自如:

.java檔案

Java原始檔

.class檔案

Java位元組碼檔案,是一種能夠被Java虛擬機器(JVM:Java Virtual Machine)識別,載入並且執行的檔案格式。

.class檔案生成

在java中是由.java檔案轉化而來的(也可由python,C++等通過編譯轉化而來),下面舉例Hello.java轉化為Hello.class的兩種方法:

• 生成時不指定JDK的版本,則可以執行javac Hello.java

• 通常為了相容低版本,例如Android系統,我們一般指定比較低版本的JDK,否則無法執行,如要指定1.6版本的JDK,命令如下:

.class檔案執行命令

如要執行hello.class,命令為:java hello,注意不加.class字尾,

class檔案的作用

class檔案的作用是記錄一個類檔案的所有資訊。

例如記住了當前類的引用this、父類super等等。class檔案記錄的資訊往往比java檔案多。

class檔案的結構

• 8位位元組的二進位制流檔案

• 各個資料緊密排列,無間隙,減少了檔案體積,加快載入速度

• 每個類或者介面單獨佔據一個class檔案,每個類單獨管理,沒有交叉

class檔案的弊端

• 記憶體佔用大,不適合於移動端

• 堆疊的載入模式導致載入速度慢

• 檔案IO操作多,類查詢慢

.dex檔案

Dalvik位元組碼檔案,是一種能夠被Dalvik虛擬機器(DVM:Dalvik Virtual Machine)或者Art虛擬機器執行並且載入的檔案格式。

dex檔案的生成

是由.class檔案轉化而來的,先生成.class檔案(注意執行低版本的JDK版本,否則手機無法執行),然後需要dx.bat工具,執行:

dex檔案執行

• 第一步:開啟Android Vitual Device Manager

• 第二步:將.dex檔案放進安卓模擬器環境

• adb push Hello.dex /data/local

• 第三步:執行.dex檔案

adb shell dalvikvm –cp /data/local/Hello.dex Hello(注意這裡最後的java原檔名HelloXidian要與檔案中類名同名,否則在編譯時不會出錯,到了這裡才會出錯)

此時命令輸出:Hello

dex檔案的作用

dex檔案的作用是記錄整個工程(通常是一個Android工程)的所有類檔案的資訊。

class檔案與dex檔案的比較

本質上都是一樣的,都是二進位制流檔案格式,dex檔案是從class檔案演變而來的

class檔案存在冗餘資訊,dex檔案則去掉了冗餘,並且整合了整個工程的類資訊。