android apk編譯打包過程
Android安裝包的字尾都是.apk, apk是Android Package的縮寫。 解壓apk檔案後包含AndroidManifest.xml、assets目錄、classes.dex(還可能有 classes2.dex,classes3.dex...classesN.dex)、lib目錄、META-INF目錄、res目錄和resources.arsc。
AndroidManifest.xml對應原始碼中的AndroidManifest.xml, 但這裡是編譯過的,檔案內容已經不同了。
assets對應原始碼的assets目錄, 是直接複製過來的。
classes.dex是包含所有Java檔案對應的位元組碼。
lib目錄對應原始碼中的libs目錄,包含so檔案。
META-INF目錄包含CERT.RSA、CERT.SF、MANIFEST.MF等, 儲存了各個資原始檔的SHA1值,用於校驗資原始檔是否被篡改,從而防止二次打包時資原始檔被替換。
res目錄對應原始碼的res目錄, 包含各種圖片、xml等。
resources.arsc包含了各個資原始檔的對映, 可以理解為索引, 通過該檔案能找到對應的資原始檔資訊。
打包過程:
這張圖清晰的描述了整個打包過程, 可以跟Android SDK的build-tools目錄對應起來。
Android編譯打包過程主要分為如下7個步驟:
1. aapt過程
使用檔案aapt/aapt2打包res目錄資原始檔, 生成R.java、resources.arsc和res目錄。
R.java儲存了所有id的值, 資料型別都是整型。
2、aidl生成Java檔案
AIDL是Android Interface Definition Language的簡稱, 是Android跨程序通訊的一種方式。 檢索工程裡所有的aidl檔案,並轉換為對應的Java檔案。
3、 Javac編譯。
使用JDK裡的javac編譯R.java、aidl生成的Java檔案、Java原始檔, 並生成.class檔案。
4、 生成dex檔案。
通過dx工具將.class檔案生成為classes.dex, 目前的gradle multi-dex編譯方式會生成classes2.dex ... classesN.dex。
5、 生成apk檔案。
使用ApkBuilder將resources.arsc、res目錄、AndroidManifest.xml、assets目錄、dex檔案打包成apk, 具體邏輯是在com.android.sdklib.build.ApkBuilder中實現的。
6、簽名apk檔案。
使用apksigner為安裝包添加簽名資訊。
7、 zipalign優化簽名包。
使用zipalign工具對簽名包進行記憶體對齊操作, 即優化安裝包的結構。
綜上所述, Android SDK中build-tools目錄提供了各種程式, 都是獨立可執行的,可以認為Android Studio編譯打包過程是對這些工具的封裝。
只打包部分程式碼/資源需要設定gradle sourceSets, 多渠道打包可以參考美團做法或使用mulchannel
參考: