應(yīng)用程序是安卓系統(tǒng)重要的組成部分,我們可以通過很多方式在安卓系統(tǒng)上安裝應(yīng)用程序,就像Windows系統(tǒng)的appx和塞班系統(tǒng)的sis一樣,安卓系統(tǒng)的應(yīng)用程序也有其專屬的安裝包格式——apk。
apk的全稱是AndroidPackage,翻譯成中文就是“安卓安裝包”。既然apk是“包”,那就說明里面包著很多東西,這就讓我很好奇了,里面到底有些什么???
apk其實(shí)就是一個壓縮文件,把它的文件擴(kuò)展名改成zip格式之后可以直接解壓,今天,IT之家就拆開一個安卓應(yīng)用的安裝包,帶大家看看里面到底都有些什么。
我們今天開刀的小白鼠是微軟最近上架的待辦事項應(yīng)用——Microsoft To-Do。
▲因?yàn)閍pk是個壓縮文件,所以直接把它的擴(kuò)展名改為zip即可。
將安裝包解壓后,我們可以看到里面的一些文件夾和文件:
應(yīng)用程序所有的代碼、資源和配置文件都在里面,我們來一個一個看。
一、/assets
通常這個文件夾里存放的是一些靜態(tài)文件,比如說明文檔或者字體文件,我們以Microsoft To-Do的安裝包為例,它的/assets目錄下有個名為fonts的子目錄,打開它,我們可以看到三個ttf格式的字體文件。
當(dāng)然了,不同類型應(yīng)用的安裝包,它/assets里面包含的資源也是不同的,比如有些瀏覽器應(yīng)用的/assets目錄下有很多html格式的文件,這些文件用旗魚瀏覽器可以直接打開:
二、/META-INF
通常這個文件夾里存放的是安裝包的簽名證書和安裝包中所有文件哈希值的計算結(jié)果。
應(yīng)用程序的安裝包在打包的時候,每個文件都會經(jīng)過校驗(yàn)計算,計算結(jié)果就存放在/META-INF里,
我們可以直接使用文本編輯器來打開后綴名為MF和SF的記錄這些文件校驗(yàn)計算結(jié)果的文件:
在我們安裝一個應(yīng)用的時候,系統(tǒng)會首先根據(jù)/META-INF里的文件校驗(yàn)結(jié)果來核實(shí)安裝包中文件的正確性和完整性,目的是確保安全,避免用戶安裝到遭受過病毒感染的或者被惡意篡改過的應(yīng)用程序。
這個文件夾下的RSA格式的文件是開發(fā)者對該應(yīng)用程序進(jìn)行簽名的簽名證書文件,玩過塞班系統(tǒng)的同學(xué)應(yīng)該對這個詞并不陌生,這也是為了保證應(yīng)用程序和系統(tǒng)的安全,簽名文件不是純文本格式,不過當(dāng)我們用文本編輯器打開它時,可以在亂碼中零散地看到Microsoft Corporation字樣。
三、/res
res是resource的縮寫,里面存放的是應(yīng)用程序的資源文件,比如圖片素材和布局文件,這個文件夾下有很多子目錄,
其中,以anim開頭的文件夾,通常里面存放的是應(yīng)用程序的動畫效果資源;
以color開頭的文件夾,通常里面存放的是應(yīng)用程序的各種顏色值;
以drawable開頭的文件夾,通常里面存放的是應(yīng)用程序的圖片或圖形資源;
有些以drawable開頭的文件夾在結(jié)尾會跟著諸如hdpi、xhdpi這樣表示解析度的字符,目的是適配不同分辨率的屏幕。
我們來進(jìn)入一個以drawable開頭的文件夾,可以看到里面有png和webp格式的圖片,其中,webp格式的圖片可以用旗魚瀏覽器打開:
以layout開頭的文件夾,通常里面存放的是應(yīng)用程序的界面布局文件;
以mipmap開頭的文件夾,Microsoft To-Do在里面存放了應(yīng)用圖標(biāo)。
四、/AndroidManifest.xml
AndroidManifest.xml是一個單獨(dú)的文件,里面包含很多信息,比如應(yīng)用程序的包名、數(shù)據(jù)權(quán)限、接口權(quán)限、版本信息、安裝參數(shù)等等,另外,它還可以聲明應(yīng)用程序的每一個組件及其屬性,聲明應(yīng)用程序所申請的權(quán)限、進(jìn)程,聲明顯示模式等等,AndroidMainfest.xml里面包含的信息太多了,單獨(dú)為它開一篇文章都不為過。這是一個非常重要的文件,它的名稱是固定的,不能隨意修改。
五、/classes.dex
這是可在安卓的Dalvik虛擬機(jī)中直接運(yùn)行的字節(jié)碼,是由JAVA的源代碼經(jīng)過復(fù)雜的編譯形成的,和傳統(tǒng)的.class文件相比,dex文件的運(yùn)行效率更高。
六、/lib
雖然Microsoft To-Do的安裝包中不包含這個文件夾,不過它在其他安卓應(yīng)用程序安裝包中的出鏡率還是挺高的,通常這個文件夾中會存放一些應(yīng)用程序依賴的庫,一般以.so結(jié)尾。
有人可能會問了,你帶我們把a(bǔ)pk拆開了,可是里面的東西有好多都看不了啊,打開以后是亂碼,有什么用?。坎灰?,請接著往下看。
七、安卓應(yīng)用的反編譯
是的,安卓應(yīng)用安裝包里的很多文件中的內(nèi)容我們是不能直接看到的,比如Microsoft To-Do應(yīng)用,它里面的xml文件和dex文件用文本編輯器打開以后顯示的是亂碼,如果你想愉快地看到這些文件的真身,那就需要對它的安裝包進(jìn)行反編譯。
要對安卓應(yīng)用進(jìn)行反編譯,我們需要做一下準(zhǔn)備:
環(huán)境準(zhǔn)備:
安裝JAVA:官網(wǎng)地址
如何判斷你的JAVA是否安裝成功了呢?很簡單,打開命令提示符,輸入命令:
java
回車,如果顯示如下:
那就說明JAVA安裝成功了。
工具準(zhǔn)備:
apktool:下載地址
dex2jar:下載地址
jd-gui:下載地址
在開始之前我們先來說說這三個工具是干啥的。
apktool的作用是把a(bǔ)pk中那些直接打開之后顯示為亂碼的xml文件翻譯成明文;
dex2jar的作用是將classes.dex轉(zhuǎn)化為.jar文件;
jd-gui的作用是查看.jar文件中的源代碼。
我們開始吧。
首先,我們新建一個文件夾(任何位置都可以,小編把文件夾建在了桌面上),然后把我們下載好的三個工具扔進(jìn)去;
解壓那兩個zip格式的壓縮包到當(dāng)前文件夾;
接著把你要處理的apk文件扔到這個文件夾中的某個地方,小編的做法是在這個文件夾里再建了一個名為apk的文件夾,把a(bǔ)pk文件扔到了apk文件夾里:
準(zhǔn)備工作至此完成,我們開始翻譯xml。
打開命令提示符,cd進(jìn)你剛剛新建的存放著那三個工具的目錄,以小編的電腦為例,則是輸入命令:
cd C:\Users\Lenovo\Desktop\apktools
接著,輸入命令:
java -jar apktool_2.0.1.jar d -f [apk文件所在位置.apk] -o MMTS
然后回車。
以小編的為例,則是輸入:
java -jar apktool_2.0.1.jar d -f C:\Users\Lenovo\Desktop\apktools\apk\todo.apk -o MMTS
如果一切順利的話,將顯示如下:
這時,你來到你那三個工具所在的文件夾,你會看到里面新增了一個文件夾,名為MMTS,打開它,你就會看到你想要的東西:
我們來嘗試打開一個xml文件:
很好,這次終于不是亂碼了。
接著我們來反編譯應(yīng)用程序的java源代碼。
我們來到存放那三個工具的文件夾,打開里面的dex2jar-2.0文件夾,把a(bǔ)pk包中的classes.dex扔進(jìn)去。
打開命令提示符,cd進(jìn)dex2jar-2.0所在目錄;
輸入命令:
d2j-dex2jar classes.dex
回車。
如果一切順利的話,將顯示如下:
這時,我們回到dex2jar-2.0文件夾,可以看到一個新生成的名為classes-dex2jar.jar的文件,這就是我們需要的文件。
我們來到存放那三個工具的文件夾,打開里面的jd-gui-windows-1.4.0文件夾,雙擊jd-gui.exe來運(yùn)行jd-gui。
依次點(diǎn)擊File-Open file,選擇我們剛剛得到的classes-dex2jar.jar,打開它,你就能看到應(yīng)用程序的JAVA源代碼了。
需要注意的是,有些應(yīng)用,它的class是被混淆過的(比如Microsoft To-Do,如下圖):
里面的類文件名稱和方法名稱都采取了a、b、c…這樣的命名方式。
這樣做為了防止反編譯,不過就算這樣,我們通過反編譯得到的源代碼也不是不能看。
好的,今天我們分析了安卓應(yīng)用程序安裝包的結(jié)構(gòu)和里面的文件和文件夾的作用,甚至還通過反編譯看到了源代碼,如果你是安卓應(yīng)用開發(fā)的初學(xué)者,想拆開一個apk安裝包來研究和參考,那么希望這篇文章可以對你有所幫助。
廣告聲明:文內(nèi)含有的對外跳轉(zhuǎn)鏈接(包括不限于超鏈接、二維碼、口令等形式),用于傳遞更多信息,節(jié)省甄選時間,結(jié)果僅供參考,IT之家所有文章均包含本聲明。