一、概覽
-
APK是AndroidPackage的縮寫,即Android安裝包蕾久,將其發(fā)送至Android手機(jī)或模擬器中執(zhí)行即可安裝,下圖展示了我們?nèi)粘i_發(fā)中從點(diǎn)擊運(yùn)行Android Project到應(yīng)用在設(shè)備上啟動所經(jīng)歷的大體過程:
-
APK是zip格式文件拌夏,但后綴名被修改為apk僧著,通過UnZip解壓后,可以看到其包含如下文件:
resources.arsc:該文件是包含配置信息的資源查詢表障簿,起著連接代碼與資源的作用盹愚。Dex 文件中的 R.class 僅包含資源 id,AssetManager 會利用 id 到 arsc 表中查詢與當(dāng)前設(shè)備信息最匹配的資源文件路徑(或資源內(nèi)容)站故。
AndroidManifest.xml:Project中AndroidManifest.xml編譯后得到的二進(jìn)制xml文件
-
META-INF:應(yīng)用簽名信息皆怕,該目錄在應(yīng)用簽名后生成,用于校驗(yàn)資源文件是否被篡改西篓,防止二次打包時資源文件被替換愈腾,主要包括下面三個文件:
- CERT.RSA:保存公鑰、加密算法及其私鑰加密后的內(nèi)容岂津。
- MANIFEST.MF:摘要文件虱黄,包含APK內(nèi)所有文件的路徑及其 SHA1/SHA256 值。
- CERT.SF:對摘要的簽名文件吮成,包含APK內(nèi)所有文件的路徑橱乱,及其在 MANIFEST.MF 中對應(yīng)信息的 SHA1/SHA256 值辜梳。
res:Project中res目錄下(除了 values)資源文件編譯后得到的二進(jìn)制xml文件,這些文件路徑同時會體現(xiàn)在 resources.arsc 中泳叠。
classes.dex:Dex是DalvikVM executes的縮寫作瞄,即Android Dalvik可執(zhí)行程序。APK 中可能包含一個或多個 classes.dex 文件危纫,應(yīng)用程序內(nèi)的 Java/Kotlin 源碼最終會以 dalvik 字節(jié)碼的方式存在于 classes.dex 文件中
lib:native libraries粉洼,即源碼工程 jni 目錄下的 so 文件,二級目錄必須為 NDK支持的 ABI叶摄。因?yàn)楸卷?xiàng)目為新建項(xiàng)目,沒有l(wèi)ibs目錄安拟,所以解壓APK也沒有l(wèi)ib
assets:與 res/ 資源目錄不同蛤吓,assets/ 下的資源文件不會在 resources.arsc 中生成查詢條目,且 assets/ 下的資源目錄可完全自定義糠赦,業(yè)務(wù)代碼獲取 assets 資源和 res 資源的方式也完全不同会傲。因?yàn)楸卷?xiàng)目為新建項(xiàng)目,沒有assets目錄拙泽,所以解壓APK也沒有assets
二淌山、具體過程
-
在APK編譯打包過程中,用到了以下工具顾瞻,這些工具大部分位于Android SDK的build-tools目錄下:
aapt:全稱Android Asset Packaging Tool泼疑,即Android資源打包工具
aidl:將.aidl文件轉(zhuǎn)換為.java文件的工具
Java Compiler:java編譯器,將.java文件轉(zhuǎn)換為.class文件的工具荷荤,運(yùn)行命令javac
dex:將.class文件轉(zhuǎn)換為Davik VM能識別的.dex文件的工具退渗,運(yùn)行命令dx
apkbuilder:生成APK的工具
Jarsigner:.jar文件的簽名工具
zipalign:字節(jié)碼對齊工具
-
Android Project編譯打包主要分為如下7個步驟:
-
aapt過程:使用aapt/aapt2打包res目錄資源文件,生成R.java蕴纳、resources.arsc和res目錄会油。
-
R.java保存了res目錄下所有資源的id,數(shù)據(jù)類型都是整型古毛,我們在程序中都是通過使用Android API依據(jù)R文件中的資源id來獲取對應(yīng)資源
-
aidl生成Java文件:AIDL是Android Interface Definition Language的縮寫翻翩,是Android跨進(jìn)程通訊的一種方式,該階段會檢索Project中所有的aidl文件稻薇,并轉(zhuǎn)換為對應(yīng)的Java文件嫂冻。
javac編譯:使用JDK里的javac編譯Project src目錄下的Java源文件、R.java以及aidl生成的Java文件塞椎,并生成.class文件絮吵。
生成DEX文件:通過dx工具將.class文件轉(zhuǎn)換為classes.dex,目前的gradle multi-dex編譯方式會生成classes2.dex ... classesN.dex忱屑。
打包生成APK:使用apkBuilder將resources.arsc蹬敲、res目錄暇昂、AndroidManifest.xml、assets目錄伴嗡、dex文件打包成初始APK急波,具體邏輯是在com.android.sdklib.build.ApkBuilder中實(shí)現(xiàn)的。
簽名apk文件:使用apksigner為APK添加簽名信息
zipalign優(yōu)化簽名包:使用zipalign工具對簽名包進(jìn)行內(nèi)存對齊操作瘪校,即優(yōu)化安裝包的結(jié)構(gòu)澄暮。
-