學習思路
(1)打包過程輸入的是什麼?
(2)打包過程輸出的是什麼?
(3)打包過程使用了哪些工具?
流程圖
- 對照 編譯打包步驟 一起看
編譯打包步驟
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檔案時的速度會更快。對齊的作用就是減少執行時記憶體的使用。