簡單的編譯流程圖
下圖取自Google官方的Build System Overview ,這個Android APK編譯流程圖有很久了,估計很多人都比較熟悉,可以好好的體會一下這個編譯流程,然后對比下面一種基于Gradle編譯的新的編譯流程圖。
AntCompile.png
詳細(xì)的編譯流程圖
下圖取自Google官方New Build System的Build WorkFlow,可以看到新的編譯流程圖比較詳細(xì),但是大體上和以前的編譯流程沒有區(qū)別。
GradleCompile.png
App編譯流程
一個Android應(yīng)用從開始編譯到打包大致上會經(jīng)歷三個步驟:編譯前檢查--> 編譯(資源文件和源碼)-->打包簽名
我們以最熟悉的Android Studio開發(fā)應(yīng)用為例,首先,我們把Gradle構(gòu)建項目從本文中剖離開,不討論具體的Gradle構(gòu)建是怎么回事,只關(guān)注于代碼是如何通過一系列的Android編譯工具最終生成APK的。
編譯步驟如下:
- 首先在編譯階段,會對資源文件文件進(jìn)行檢查,包括AndroidManifest.xml 、res目錄下的所有文件(文件名是否合理),在檢查通過后,對資源文件進(jìn)行處理,一次編譯生成resources.arsc 和 R.java文件,在完成資源編譯后,會針對res目錄下的xml文件和AndroidManifest.xml分別進(jìn)行編譯,這樣處理過的xml文件就被簡單的“加密”(如果你解壓一個apk,會發(fā)現(xiàn)所有的xml布局文件都是亂碼),最后處理后的res&AndroidManifest.xml&resources.arsc會打包壓縮成resources.ap_文件,在AndroidStudio的項目下
/app/build/intermediates/res
目錄下可以看到編譯打包后生成的資源打包文件。如果項目中使用了NDK來編譯native代碼,則也會在這個階段編譯并生成.so庫文件。在apkbuilder的時候作為三方庫文件打包進(jìn)應(yīng)用。 - 處理AIDL文件,在編譯階段會將.aidl的文件編譯生成相應(yīng)的java代碼供程序調(diào)用。
- 編譯工程源碼,生成相應(yīng)的class文件,位于項目
/app/build/intermediates/classes
目錄下。 - 在class文件生成后,如果使用了混淆,則會調(diào)用proguard.jar文件對class文件和資源文件進(jìn)行混淆優(yōu)化處理,同時生成混淆的mapping文件,位于
/app/
,如果沒有使用混淆,則直接轉(zhuǎn)換所有的class文件生成classes.dex文件。 - 打包生成APK文件。