1. 程式人生 > >Android APK打包流程

Android APK打包流程

概述

今天主要講一下Android程式的生成步驟,即Android打包成APK的流程。

通常情況下,在開發過程中打包APK是一件很簡單的事,主要可以通過兩種方式:一種是用Eclipse或者Android Studio整合開發環境直接生成APK;另一種是使用Ant\Gladle等工具生成APK。當你解壓以後會發現它內部主要就是資原始檔和classes.dex。這個classes.dex就是Android系統Dalvik或ART虛擬機器的可執行檔案。

Android Developer官網對APK打包有具體的介紹,點選這裡檢視

同時提供一張APK打包的流程圖,如下:

打包流程

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

打包資源的工具是aapt(The Android Asset Packaing Tool),位於android-sdk/platform-tools目錄下。在這個過程中,專案中的AndroidManifest.xml檔案和佈局檔案XML都會編譯,然後生成相應的R.jva。

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

這一過程中使用到的工具是aidl(Android Interface Definition Language),即Android介面描述語言。位於android-sdk/platform-tools目錄下。aidl工具解析介面定義檔案然後生成相應的Java程式碼介面供程式呼叫。

如果在專案沒有使用到aidl檔案,則可以跳過這一步。

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

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

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

dx工具生成可供Android系統Dalvik虛擬機器執行的classes.dex檔案,該工具位於android-sdk/platform-tools 目錄下。

任何第三方的libraries.class檔案都會被轉換成.dex檔案。

dx工具的主要工作是將Java位元組碼轉成成Dalvik位元組碼、壓縮常量池、消除冗餘資訊等。

5. 打包生成APK檔案

所有沒有編譯的資源(如images等)、編譯過的資源和.dex檔案都會被apkbuilder工具打包到最終的.apk檔案中。

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

6. 對APK檔案進行簽名

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

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

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

如果你釋出的apk是正式版的話,就必須對APK進行對齊處理,用到的工具是zipalign,它位於android-sdk/tools目錄下。

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

對齊的作用就是減少執行時記憶體的使用。

Note

APP應用中方法數都被限制為64K。如果你的應用中方法數達到這個上限,在打包過程中就會輸出以下的錯誤資訊:

Unable to execute dex: method ID not in [0, 0xffff]: 65536.

至於為什麼會限制64k的上限,接下來我會分析。當然,官方開發文件也有分析,可以看這裡