android 編譯過程

引用:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.htmlhtml

http://blog.sina.com.cn/s/blog_7bee201901013nkk.htmljava

Android工程的編譯過程

如今不少人想對Android工程的編譯和打包進行自動化,好比創建每日構建系統、自動生成發佈文件等等。這些都須要咱們對Android工程的編譯和打包有一個深刻的理解,至少要知道它的每一步都作了什麼,須要什麼環境和工具,輸入和輸出是什麼。那麼咱們就來挖掘一下Android的編譯過程當中的細節。linux

首先,咱們假定你的系統(什麼系統都行,不限於Linux仍是Windows系統,固然,我在這裏默認使用Linux系統來舉例子,但在 Windows中幾乎沒有什麼差異)已經安裝了JDK和Android SDK。再假定你的Android SDK的路徑是ANDROID_SDK_HOME,你想要編譯的Android OS版本是ANDROID_OS_VERSION(好比android-1.六、android-八、android-10等)。android

咱們重點關心的是(1)這個過程的輸入是什麼?(2)這個過程的輸出是什麼?(3)這個過程使用了什麼工具?至於使用什麼參數,能夠本身去看對應命令的幫助文件,或者在網上搜索,這不是本文的重點。app

步驟中提到的工具以下表:工具

名稱 功能介紹 在操做系統中的路徑
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 字節碼對齊工具 ${ANDROID_SDK_HOME}/tools/zipalign

第一步:打包資源文件,生成R.java文件
【輸入】Resource文件(就是工程中res中的文件)、Assets文件(至關於另一種資源,這種資源Android系統並不像對res中的文件那樣優化它)、AndroidManifest.xml文件(包名就是從這裏讀取的,由於生成R.java文件須要包名)、Android基礎類庫(Android.jar文件)
【輸出】打包好的資源(通常在Android工程的bin目錄能夠看到一個叫resources.ap_的文件就是它了)、R.java文件(在gen目錄中,你們應該很熟悉了)
【工具】aapt工具,它的路徑在${ANDROID_SDK_HOME}/platform-tools/aapt(若是你使用的是Windows系統,按慣例路徑應該這樣寫:%ANDROID_SDK_HOME%\platform-tools\aapt.exe,下同)。post

第二步:處理AIDL文件,生成對應的.java文件(固然,有不少工程沒有用到AIDL,那這個過程就能夠省了)
【輸入】源碼文件、aidl文件、framework.aidl文件
【輸出】對應的.java文件
【工具】aidl工具優化

第三步:編譯Java文件,生成對應的.class文件
【輸入】源碼文件(包括R.java和AIDL生成的.java文件)、庫文件(.jar文件)
【輸出】.class文件
【工具】javac工具ui

第四步:把.class文件轉化成Davik VM支持的.dex文件
【輸入】 .class文件(包括Aidl生成.class文件,R生成的.class文件,源文件生成的.class文件),庫文件(.jar文件)
【輸出】.dex文件
【工具】javac工具url

第五步:打包生成未簽名的.apk文件
【輸入】打包後的資源文件、打包後類文件(.dex文件)、libs文件(包括.so文件,固然不少工程都沒有這樣的文件,若是你不使用C/C++開發的話)
【輸出】未簽名的.apk文件
【工具】apkbuilder工具

第六步:對未簽名.apk文件進行簽名
【輸入】未簽名的.apk文件
【輸出】簽名的.apk文件
【工具】jarsigner

第七步:對簽名後的.apk文件進行對齊處理(不進行對齊處理是不能發佈到Google Market的)
【輸入】簽名後的.apk文件
【輸出】對齊後的.apk文件
【工具】zipalign工具

知道了這些細節以後,咱們就能夠實現不少咱們想實現東西了,好比:自動化,咱們能夠使用某種腳本,像Windows下的批處理,linux下的Bash,Java下的Ant,Python、Perl這樣的腳本語言,甚至直接用Java、.net這們的強類型語言也是能夠的。若是你真正弄懂了上面的步驟,瞭解了編譯打包過程的本質,你徹底能夠以你想要的任何方式實現它的自動化,這纔是真正的「觸類旁通,以不變應萬變」。再好比,對Android SDK的精簡,你們知道,如今Android SDK動轍幾百兆,咱們徹底能夠應用上面的知識,只保留必要的工具,把SDK精簡到10M如下。固然,還能夠作不少事情,前提是你真正弄懂了它。

相關文章
相關標籤/搜索