第一步:打包資源文件,生成R.java文件.打包資源的工具 aapt 位於 android-sdk\platform-tools目錄下 ,該工具的源碼在Android 系統源碼的 frameworks\base\tools\aapt目錄下,生成的過程主要是調 用了aapt 源碼目錄下 Resource.cpp文件中的 buildResourcesO函數,該函數首先檢查AndroidManifest.xml 的合法性,而後對res目錄下的資源子目錄進行處理, 處理的函數爲 makeFileResources(),處理的內容包括資源文件名的合法性檢查,向資源表 table 添加條目等,處理完後調用 compileResourceFile()函數編譯 res與 asserts目錄下的資源 並生成 resources.arsc 文件,compileResourceFile數位於aapt源碼目錄的 ResourceTable.cpp 文件中,該函數最後會調用parseAndAddEntry0函數生成R.java 文件,完成資源編譯後,接 下來調用 compileXmlFile函數對res目錄的子目錄下的 xml文件分別進行編譯,這樣處理 過的 xml 文件就簡單的被「加密」了,最後將全部的資源與編譯生成的 resources.arsc 文件 以及「加密」過的AndroidManifcst.xml文件打包壓縮成resources.ap_文件(使用Ant工具命 令行編譯則會生成與 build.xml中「project name」指定的屬性同名的ap 文件).java
第二步:處理aidl文件,生成相應的Java文件.對於沒有使用到aidl的Android工程, 這一步能夠跳過.這一步使用到的工具爲aidl,位於 android-sdk\platform-tools目錄下,aidl 工具解析接口定義文件(aidl爲 android interface definition language的首字母寫,Android 接口描述語言)並生成相應的 Java 代碼供程序調用,有興趣的朋友能夠查看它的源碼,位 於 Android 源碼的 frameworks\base\tools\haidl 目錄下.android
第三步:編譯工程源代碼,生成相應的class文件.這一步調用javac編譯工程src目錄 下全部的java源文件,生成的 class文件位於工程的bin\classes目錄下,假定編譯 工程源代碼時程序是基於 Android SDK開發的,實際開發過程當中,也有可能會使用Android NDK 來編譯 native 代碼,所以,若是可能的話,這一步還須要使用 Android NDK 編譯C/C++ 代碼,固然,編譯C/C++代碼的步驟也能夠提早到第一步誠第二步.函數
第四步:轉換全部的class文件,生成classes.dex文件.前面曾屢次提到,Android系統 Dalvik 虛擬機的可執行文件爲 DEX格式,程序運行所需的classes.dex就是在這一步生成的, 使用到的工具爲dx,它位於 android-sdk\platform-tools目錄下,dx工具主要的工做是將Java 字節碼轉換爲 Dalvik字節碼、壓縮常量池,消除冗餘信息等工具
第五步:打包生成APK文件.打包的工具爲apkbuilder,官位於android-sdk\tools目錄 下,apkbuilder爲一個腳本文件,實際調用的是 android-sdk\tools\lib\sdk\lib.jar 文件中的 com.android.sdklib.build.ApkBuilderMain類,它的實現代碼位於 Android 系統源碼的 sdk\sdkmanager\libs\sdklib\src\com\androidsdk\lib\build\ApkBuilderMain.java 文件,代碼構建 了一個 ApkBuilder類,而後以包含 resources.arsc 的文件爲基礎生成ak文件 這個文件 通常爲 ap_結尾的文件,接者調用 addSourceFolderO函數添加工程的資源,addSourceFolderO 會調用 processFileForResourceO函數往apk 文件中添加資源,處理的內容包括res目錄與assets 目錄中的文件,添加完資源後調用 addResourcesFromJar()數往apk文件中寫入依賴庫,接 着調用 addNativeLibraries()函數添加工程libs目錄下的Native庫(經過Android NDK編譯生 成的so或bin 文件),最後調用 sealApk()關閉apk文件,ui
第六步:對APK文件進行簽名.Android 的應用程序須要簽名才能在Android設備上安 裝,簽名apk文件有兩種狀況:一種是在調試程序時進行簽名,使用 Eclipse開發Android程 序時,在編譯調試程序時會本身使用一個debug.keystore對apk進行簽名: 另外一種是打包發 布時對程序進行簽名,這種狀況下須要提供了一個符合Android 開發文檔中要求的簽名文件. 簽名的方法也有兩種:一種是使用 JDK 中提供的jarsigner 工具簽名:另外一種是使用Android 源碼中提供的 signapk工具,它的代碼位於 Android 系統源碼的 build\tools\signapk目錄下.加密
第七步:對簽名後的 APK文件進行對齊處理.這一步須要使用到的工具爲zipalign,它 位於 android-sdk\tools目錄,源碼位於 Android 系統源碼的 build\tools\zipalign目錄,它的主 要工做是將apk包進行對齊處理,使apk包中的全部資源文件距離文件起始偏移爲4字節整 數倍,這樣經過內存映射訪問apk文件時的速度會更快,驗證apk文件是否對齊過的工做由 ZipAlign.cpp 文件的 verify()函數完成,處理對齊的工做則出 process()函數完成.debug
官方流程圖 調試
簡化流程圖 orm
詳細的流程圖 cdn