abstrakt:1、什么是dex?簡單說就是優(yōu)化后的android版.exe。每個(gè)apk安裝包里都有。相對于PC上的java虛擬機(jī)能運(yùn)行.class;android上的Davlik虛擬機(jī)能運(yùn)行.dex。為何要研究dex格式?因?yàn)閐ex里面包含了所有app代碼,利用反編譯工具可以獲取java源碼。理解并修改dex文件,就能更好的apk破解和防破解。 2、dex好處dex文件有個(gè)天大的好處:它可以直接用De
1、什么是dex?
簡單說就是優(yōu)化后的android版.exe。每個(gè)apk安裝包里都有。
相對于PC上的java虛擬機(jī)能運(yùn)行.class;android上的Davlik虛擬機(jī)能運(yùn)行.dex。
為何要研究dex格式?因?yàn)閐ex里面包含了所有app代碼,利用反編譯工具可以獲取java源碼。理解并修改dex文件,就能更好的apk破解和防破解。
2、dex好處
dex文件有個(gè)天大的好處:它可以直接用DexClassLoader類加載,這叫動(dòng)態(tài)加載。于是我們只要在dex上加殼,在程序運(yùn)行時(shí)脫殼,就可以規(guī)避靜態(tài)反編譯的風(fēng)險(xiǎn)。
3、一般的反編譯流程是什么樣子的。
1、下載apk文件,然后解壓 ,得到 class.dex 文件
2、用dex2jar 把 class.dex 還原成 classes-dex2jar.jar 文件
3、用 jd-gui.exe 把 classes-dex2jar.jar 文件打開,就可以看到源碼了。
4、Android 為什么會(huì)出現(xiàn) 65536限制問題?
在Android系統(tǒng)中,一個(gè)App的所有代碼都在一個(gè)Dex文件里面。Dex是一個(gè)類似Jar的包,存儲(chǔ)了很多Java編譯字節(jié)碼的歸檔文件。因?yàn)锳ndroid系統(tǒng)使用Dalvik虛擬機(jī),所以需要把使用Java Compiler編譯之后的class文件轉(zhuǎn)換成Dalvik能夠執(zhí)行的class文件。這里需要強(qiáng)調(diào)的是,Dex和Jar一樣是一個(gè)歸檔文件,里面仍然是Java代碼對應(yīng)的字節(jié)碼文件。當(dāng)Android系統(tǒng)啟動(dòng)一個(gè)應(yīng)用的時(shí)候,有一步是對Dex進(jìn)行優(yōu)化,這個(gè)過程有一個(gè)專門的工具來處理,叫DexOpt。DexOpt的執(zhí)行過程是在第一次加載Dex文件的時(shí)候執(zhí)行的。這個(gè)過程會(huì)生成一個(gè)ODEX文件,即Optimised Dex。執(zhí)行ODex的效率會(huì)比直接執(zhí)行Dex文件的效率要高很多。但是在早期的Android系統(tǒng)中,DexOpt有一個(gè)問題,也就是這篇文章想要說明并解決的問題。DexOpt會(huì)把每一個(gè)類的方法id檢索起來,存在一個(gè)鏈表結(jié)構(gòu)里面。但是這個(gè)鏈表的長度是用一個(gè)short類型來保存的,導(dǎo)致了方法id的數(shù)目不能夠超過65536個(gè)。當(dāng)一個(gè)項(xiàng)目足夠大的時(shí)候,顯然這個(gè)方法數(shù)的上限是不夠的。盡管在新版本的Android系統(tǒng)中,DexOpt修復(fù)了這個(gè)問題,但是我們?nèi)匀恍枰獙舷到y(tǒng)做兼容。