概述
我們通過 Android studio APK Analyze 可以展開一個(gè)APK文件
- META-INF
- res
- anim
- color
- drawable
- drawable-hdpi
- drawable-land
- drawable-land-hdpi
- drawable-mdpi
- drawable-port
- drawable-port-hdpi
- layout
- layout-land
- layout-port
- xml
- AndroidManifest.xml
- classes.dex
- resources.arsc
META-INF
META-INF目錄下存放的是簽名信息嫂便,用來保證apk包的完整性和系統(tǒng)的安全鼎俘。里面包含了三個(gè)文件,MANIFEST.MF肥隆、CERT.SF、CERT.RSA砖织。
- MANIFEST.MF
apk中的這個(gè)MANIFEST.MF藏斩,列出了apk的所有文件,以及這些文件內(nèi)容所對(duì)應(yīng)的base64-encoded SHA1 哈希值劫狠,
Name: classes.dex
SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=
上述表示classes.dex這個(gè)文件的SHA1的哈希值為l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=
- CERT.SF
CERT.SF和MANIFEST.MF很相似,但是它描述的不是文件內(nèi)容的hash值牧抽,而是列出了MANIFEST.MF這個(gè)文件中每條信息的hash值嘉熊,舉例會(huì)明白些:
Name: classes.dex
SHA1-Digest: ubmMiUS24rU/6K5JloMVG4vHKIU=
上面這條hash值ubmMiUS24rU/6K5JloMVG4vHKIU=
對(duì)應(yīng)的是MANIFEST.MF中下面這幾行字符串的hash值
Name: classes.dex
SHA1-Digest: l8Lc+gtdLvtxJ1K+kscUmWQGQ1E=
注:計(jì)算SHA1-Digest-Manifest時(shí)遥赚,輸入的字符串是三行扬舒,還要包括一行空白行,即’\r\n’凫佛。讲坎!
- CERT.RSA
包含了公鑰和私鑰簽名后的一些信息
它的基本格式是這樣的:
res目錄
res目錄存放資源文件
目錄 | 資源類型 |
---|---|
animator/ |
用于定義屬性動(dòng)畫的 XML 文件孕惜。 |
anim/ |
定義漸變動(dòng)畫的 XML 文件。(屬性動(dòng)畫也可以保存在此目錄中晨炕,但是為了區(qū)分這兩種類型衫画,屬性動(dòng)畫首選 animator/ 目錄。) |
color/ |
用于定義顏色狀態(tài)列表的 XML 文件瓮栗。請(qǐng)參閱顏色狀態(tài)列表資源 |
drawable/ |
位圖文件(.png 削罩、.9.png 、.jpg 费奸、.gif )或編譯為以下可繪制對(duì)象資源子類型的 XML 文件:位圖文件九宮格(可調(diào)整大小的位圖)狀態(tài)列表形狀動(dòng)畫可繪制對(duì)象其他可繪制對(duì)象請(qǐng)參閱 可繪制對(duì)象資源弥激。 |
mipmap/ |
適用于不同啟動(dòng)器圖標(biāo)密度的可繪制對(duì)象文件。如需了解有關(guān)使用 mipmap/ 文件夾管理啟動(dòng)器圖標(biāo)的詳細(xì)信息愿阐,請(qǐng)參閱管理項(xiàng)目概覽微服。 |
layout/ |
用于定義用戶界面布局的 XML 文件。 請(qǐng)參閱布局資源缨历。 |
menu/ |
用于定義應(yīng)用菜單(如選項(xiàng)菜單以蕴、上下文菜單或子菜單)的 XML 文件。請(qǐng)參閱菜單資源辛孵。 |
raw/ |
要以原始形式保存的任意文件丛肮。要使用原始 InputStream 打開這些資源,請(qǐng)使用資源 ID(即 R.raw.*filename* )調(diào)用 Resources.openRawResource() 魄缚。但是腾供,如需訪問原始文件名和文件層次結(jié)構(gòu),則可以考慮將某些資源保存在 assets/ 目錄下(而不是 res/raw/ )鲜滩。assets/ 中的文件沒有資源 ID伴鳖,因此您只能使用 AssetManager 讀取這些文件。 |
values/ |
包含字符串徙硅、整型數(shù)和顏色等簡(jiǎn)單值的 XML 文件榜聂。其他 res/ 子目錄中的 XML 資源文件是根據(jù) XML 文件名定義單個(gè)資源,而 values/ 目錄中的文件可描述多個(gè)資源嗓蘑。對(duì)于此目錄中的文件须肆,<resources> 元素的每個(gè)子元素均定義一個(gè)資源。例如桩皿,<string> 元素創(chuàng)建 R.string 資源豌汇,<color> 元素創(chuàng)建 R.color 資源。由于每個(gè)資源均用其自己的 XML 元素定義泄隔,因此您可以根據(jù)自己的需要命名文件拒贱,并將不同的資源類型放在一個(gè)文件中。但是,為了清晰起見逻澳,您可能需要將獨(dú)特的資源類型放在不同的文件中闸天。 例如,對(duì)于可在此目錄中創(chuàng)建的資源斜做,下面給出了相應(yīng)的文件名約定:arrays.xml苞氮,用于資源數(shù)組(類型化數(shù)組)。colors.xml:顏色值瓤逼。dimens.xml:尺寸值笼吟。strings.xml:字符串值。styles.xml:樣式霸旗。請(qǐng)參閱字符串資源赞厕、樣式資源和更多資源類型。 |
xml/ |
可以在運(yùn)行時(shí)通過調(diào)用 Resources.getXML() 讀取的任意 XML 文件定硝。各種 XML 配置文件(如可搜索配置)都必須保存在此處皿桑。 |
resources.arsc
編譯后的二進(jìn)制資源文件,主要作用是App的資源索引表蔬啡,可以從二進(jìn)制的文件中查找到資源的相關(guān)信息诲侮,或者根據(jù)資源的id可以定位到二進(jìn)制文件中的位置
classes.dex文件
簡(jiǎn)單來說就是android系統(tǒng)的可執(zhí)行文件,類似于window系統(tǒng)的xx.exe,它包含應(yīng)用程序的全部操作指令以及運(yùn)行時(shí)數(shù)據(jù)
題外:ART 和 Dalvik
我們知道Java程序都是通過Java虛擬機(jī)執(zhí)行的箱蟆,Android應(yīng)用是采用Java開發(fā)的沟绪,基于移動(dòng)設(shè)備的特點(diǎn),如內(nèi)存以及電量等諸多方面跟一般的 PC 設(shè)備都有本質(zhì)的區(qū)別空猜,所以需要開發(fā)更符合移動(dòng)設(shè)備的用于執(zhí)行 Java 代碼的虛擬機(jī)绽慈,也就是Dalvik和 ART。
Dalvik和 ART 并不是完全按照J(rèn)VM的規(guī)范開發(fā)的辈毯,一般JVM虛擬機(jī)運(yùn)行的是 .class 文件坝疼,而 Dalvik和 ART 運(yùn)行的是DEX文件。
Java 虛擬機(jī)執(zhí)行 .class 格式的字節(jié)碼谆沃。每一個(gè) Java 文件對(duì)應(yīng)一個(gè) .class 的字節(jié)碼文件钝凶,JVM 在運(yùn)行時(shí)為每一個(gè)執(zhí)行到的類裝載字節(jié)碼。而 Android 設(shè)備上為了提高執(zhí)行效率唁影,在編譯 Android 項(xiàng)目時(shí)耕陷,Android 通過 SDK 提供的工具 dex.jar 會(huì)把所有的 .class 文件最終打包成一個(gè)或者多個(gè) .dex 文件
ART 和 Dalvik 區(qū)別
Dalvik 是 ART 的前身 窥摄,從 Android L 開始锉矢,Android 開始啟用了新設(shè)計(jì)的虛擬機(jī) ART 。
ART 比起 Dalvik 有以下優(yōu)勢(shì):
- 預(yù)先 (AOT) 編譯
ART 引入了預(yù)先編譯機(jī)制巍耗,可提高應(yīng)用的性能锌介。在安裝時(shí)嗜诀,ART 使用設(shè)備自帶的 dex2oat
工具來編譯應(yīng)用,并為目標(biāo)設(shè)備生成經(jīng)過編譯的應(yīng)用可執(zhí)行文件
- 垃圾回收方面的優(yōu)化
我們知道執(zhí)行GC操作的時(shí)候,任何線程的任何操作都會(huì)需要暫停裹虫,等待GC操作完成之后肿嘲,其他操作才能夠繼續(xù)運(yùn)行融击,所以GC在 Dalvik 時(shí)代也是經(jīng)常被人詬病的筑公,它會(huì)導(dǎo)致界面卡頓。而ART 在GC導(dǎo)致顯示不穩(wěn)定尊浪、界面響應(yīng)速度緩慢以及其他問題都做了優(yōu)化
參考
android中簽名原理和安全性分析之meta-inf文件講解
https://source.android.com/devices/tech/dalvik