[TOC]
在這萬物皆卷的年代,再也無法躺平成為一個快樂的潛行胖子,我是??????卷王绣否,被“卷”的”juǎn“轻局。在三十而立之后洪鸭,有計劃有目標(biāo)地脫離卷軍隊列~
本文記錄安卓APK 打包流程的分析,APK 打包過程涉及多個工具仑扑、多種類型源文件和中間文件览爵,整個流程都被封裝在 Android Studio IDE 中,了解其打包流程有助于理解 APK 中的文件構(gòu)成镇饮,以用于做一些 APK 瘦身相關(guān)工作蜓竹。
本文分兩部分,首先介紹下打包過程中使用到的工具储藐,然后分析下打包的流程俱济。
打包相關(guān)工具
-
AAPT(Android Asset Packaging Tool)
AAPT 是 Android資源打包工具,會打包資源文件(res文件夾下的文件)钙勃,并生成R.java和resources.arsc文件蛛碌。
-
AIDL
AIDL工具會將所有的.aidl文件編譯成.java文件。
-
JAVAC
JAVAC 用于編譯 Java 源碼辖源,會將R.java蔚携、AIDL接口生成的java文件、應(yīng)用代碼java文件編譯成.class文件克饶。
-
dex
dex 工具用于生成 .dex 文件酝蜒,會將 .class文件轉(zhuǎn)換打包成一個.dex文件。
-
apkbuilder
apkbuilder 可以理解為一個壓縮工具矾湃,會將資源文件和 .dex 文件生成未簽名的.apk文件亡脑。
-
jarsigner
jarsigner 是簽名工具,會將未簽名的 .apk 文件轉(zhuǎn)換為簽名的 .apk 文件。
-
zipalign
資源對齊工具霉咨。
打包流程
APK 的打包流程主要包括以下步驟:
- 打包資源文件蛙紫。資源文件主要包括 AndroidManifest.xml、res 文件夾的資源文件和 xml 文件躯护,通過 AAPT 工具生成 R.java 文件和 resource.arsc 文件惊来。
- 通過 AIDL 將 .aidl 文件翻譯為 .java 文件,然后通過 javac 工具將工程下的所有 java 文件編譯成 .class 文件,這里的 Java 文件包括 R.java、工程 Java文件 和 第三方庫 Java 文件贡避。
- 通過 dex 工具將上面生成的 .class 文件及第三方 .class 文件打包為 .dex 文件。
- 通過 apkbuilder 將 .dex 文件枉证、第三方非 Java 文件(.so 文件)打包為未簽名的 .apk 文件。
- 通過 jarsigner 簽名工具對 .apk 文件進行簽名移必,生成簽名后的 .apk 文件室谚。
- 最后通過 zipalign 工具對 .apk 文件中的資源文件進行內(nèi)存對齊,以便于快速訪問崔泵。
完成的打包流程如下圖秒赤。
相關(guān)問題
-
資源文件如何通過 R.java 和 resource.arsc 快速索引到?
R.java 中存儲了每個資源文件的訪問 key憎瘸, 而 resource.arsc 文件中存儲了 key 和對應(yīng) value入篮,value中包含了資源文件訪問的路徑,類似于 Map幌甘,這樣就可以 O(1) 時間內(nèi)訪問到指定的資源文件潮售。
-
最后一步為何需要對資源文件執(zhí)行內(nèi)存對齊操作?
只有內(nèi)存對齊了之后每個資源文件的大小才是內(nèi)存塊的整數(shù)倍锅风,這樣的資源文件存儲在磁盤中酥诽,可以通過起始內(nèi)存塊的地址快速訪問到。