Android APK打包流程

我可能是一隻假程式猿發表於2019-05-06

學習思路

(1)打包過程輸入的是什麼?

(2)打包過程輸出的是什麼?

(3)打包過程使用了哪些工具?

流程圖

  • 對照 編譯打包步驟 一起看
    Android APK打包流程

編譯打包步驟

1. 打包資原始檔,生成R.java檔案

打包資原始檔的工具是aapt(The Android Asset Packaing Tool),目錄 sdk\build-tools\25.0.0\aapt

在這個過程中,專案中的AndroidManifest.xml檔案和佈局檔案XML都會編譯,然後生成相應的R.java,另外AndroidManifest.xml會被aapt編譯成二進位制。

存放在APP的res目錄下的資源,該類資源在APP打包前大多會被編譯,變成二進位制檔案,並會為每個該類檔案賦予一個resource id。對於該類資源的訪問,應用層程式碼則是通過resource id進行訪問的。

Android應用在編譯過程中aapt工具會對資原始檔進行編譯,並生成一個resource.arsc檔案,resource.arsc檔案相當於一個檔案索引表,記錄了很多跟資源相關的資訊。

2. 處理aidl檔案,生成相應的Java檔案

處理aidl檔案的工具是aidl(Android Interface Definition Language),即Android介面描述語言,目錄 sdk\build-tools\25.0.0\aidl

aidl工具解析介面定義檔案然後生成相應的Java程式碼介面供程式呼叫。如果在專案沒有使用到aidl檔案,則可以跳過這一步。

3. 編譯專案原始碼,生成class檔案

編譯原始碼使用工具是 Java編譯器(javac)

專案中所有的Java程式碼,包括R.java和.aidl檔案,都會變Java編譯器(javac)編譯成.class檔案,生成的class檔案位於工程中的bin/classes目錄下。

4. 轉換所有的class檔案,生成classes.dex檔案

這過程使用工具 dx(dex)生成可供Android系統Dalvik虛擬機器執行的classes.dex檔案,工具目錄(sdk\build-tools\25.0.0\dx)

任何第三方的libraries和.class檔案都會被轉換成.dex檔案。dx工具的主要工作是將Java位元組碼轉成 Dalvik位元組碼、壓縮常量池、消除冗餘資訊等。

5. 打包生成APK檔案

打包的工具apkbuilder,目錄 android-sdk/tools,apkbuilder為一個指令碼檔案,實際呼叫的是(sdk\tools\lib)檔案中的com.android.sdklib.build.ApkbuilderMain類。

所有沒有編譯的資源,如images、assets目錄下資源(該類檔案是一些原始檔案,APP打包時並不會對其進行編譯,而是直接打包到APP中,對於這一類資原始檔的訪問,應用層程式碼需要通過檔名對其進行訪問);

編譯過的資源和.dex檔案都會被apkbuilder工具打包到最終的.apk檔案中。

6. 對APK檔案進行簽名

一旦APK檔案生成,它必須被簽名才能被安裝在裝置上。

在開發過程中,主要用到的就是兩種簽名的keystore。一種是用於除錯的debug.keystore,它主要用於除錯,在Eclipse或者Android Studio中直接run以後跑在手機上的就是使用的debug.keystore

另一種就是用於釋出正式版本的relese.keystore,需要開發者自己配置。

7. 對簽名後的APK檔案進行對齊處理

如果你釋出的apk是正式版的話,就必須對APK進行對齊處理,用到的工具是zipalign,目錄 sdk\build-tools\25.0.0\zipalign

對齊的主要過程是將APK包中所有的資原始檔距離檔案起始偏移為4位元組整數倍,這樣通過記憶體對映訪問apk檔案時的速度會更快。對齊的作用就是減少執行時記憶體的使用。

感謝

Android APK打包流程

Android的編譯打包流程詳解

Android應用程式(APK)的編譯打包過程

blog.csdn.net/sinat_23030…

相關文章