現(xiàn)在很多人想對Android工程的編譯和打包進行自動化,比如建立每日構建系統(tǒng)、自動生成發(fā)布文件等等。這些都需要我們對Android工程的編譯和打包有一個深入的理解,至少要知道它的每一步都做了什么,需要什么環(huán)境和工具,輸入和輸出是什么。那么我們就來挖掘一下Android的編譯過程中的細節(jié)。
首先,我們假定你的系統(tǒng)(什么系統(tǒng)都行,不限于Linux還是Windows系統(tǒng),當然,我在這里默認使用Linux系統(tǒng)來舉例子,但在 Windows中幾乎沒有什么差別)已經安裝了JDK和Android SDK。再假定你的Android SDK的路徑是ANDROID_SDK_HOME,你想要編譯的Android OS版本是ANDROID_OS_VERSION(比如android-1.6、android-8、android-10等)。
我們重點關心的是(1)這個過程的輸入是什么?(2)這個過程的輸出是什么?(3)這個過程使用了什么工具?至于使用什么參數(shù),可以自己去看對應命令的幫助文件,或者在網上搜索,這不是本文的重點。
步驟中提到的工具如下表:
名稱 | 功能介紹 | 在操作系統(tǒng)中的路徑 |
aapt | Android資源打包工具 | ${ANDROID_SDK_HOME}/platform-tools/appt |
aidl | Android接口描述語言轉化為.java文件的工具 | ${ANDROID_SDK_HOME}/platform-tools/aidl |
javac | Java Compiler | ${JDK_HOME}/javac或/usr/bin/javac |
dex | 轉化.class文件為Davik VM能識別的.dex文件 | ${ANDROID_SDK_HOME}/platform-tools/dx |
apkbuilder | 生成apk包 | ${ANDROID_SDK_HOME}/tools/opkbuilder |
jarsigner | .jar文件的簽名工具 | ${JDK_HOME}/jarsigner或/usr/bin/jarsigner |
zipalign | 字節(jié)碼對齊工具 | ${ANDROID_SDK_HOME}/tools/zipalign |
第一步:打包資源文件,生成R.java文件
【輸入】Resource文件(就是工程中res中的文件)、Assets文件(相當于另外一種資源,這種資源Android系統(tǒng)并不像對res中的文件那樣優(yōu)化它)、AndroidManifest.xml文件(包名就是從這里讀取的,因為生成R.java文件需要包名)、Android基礎類庫(Android.jar文件)
【輸出】打包好的資源(一般在Android工程的bin目錄可以看到一個叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中,大家應該很熟悉了)
【工具】aapt工具,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(如果你使用的是Windows系統(tǒng),按慣例路徑應該這樣寫:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。
第二步:處理AIDL文件,生成對應的.java文件(當然,有很多工程沒有用到AIDL,那這個過程就可以省了)
【輸入】源碼文件、aidl文件、framework.aidl文件
【輸出】對應的.java文件
【工具】aidl工具
第三步:編譯Java文件,生成對應的.class文件
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫文件(.jar文件)
【輸出】.class文件
【工具】javac工具
第四步:把.class文件轉化成Davik VM支持的.dex文件
【輸入】
.class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),庫文件(.jar文件)
【輸出】.dex文件
【工具】javac工具
第五步:打包生成未簽名的.apk文件
【輸入】打包后的資源文件、打包后類文件(.dex文件)、libs文件(包括.so文件,當然很多工程都沒有這樣的文件,如果你不使用C/C++開發(fā)的話)
【輸出】未簽名的.apk文件
【工具】apkbuilder工具
第六步:對未簽名.apk文件進行簽名
【輸入】未簽名的.apk文件
【輸出】簽名的.apk文件
【工具】jarsigner
第七步:對簽名后的.apk文件進行對齊處理(不進行對齊處理是不能發(fā)布到Google
Market的)
【輸入】簽名后的.apk文件
【輸出】對齊后的.apk文件
【工具】zipalign工具
知道了這些細節(jié)之后,我們就可以實現(xiàn)很多我們想實現(xiàn)東西了,比如:自動化,我們可以使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是可以的。如果你真正弄懂了上面的步驟,了解了編譯打包過程的本質,你完全可以以你想要的任何方式實現(xiàn)它的自動化,這才是真正的“舉一反三,以不變應萬變”。再比如,對Android SDK的精簡,大家知道,現(xiàn)在Android SDK動轍幾百兆,我們完全可以應用上面的知