1. 程式人生 > >android apk編譯打包過程

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

參考: