Android工程的編譯過程

來源:互聯網
上載者:User

現在很多人想對Android工程的編譯和打包進行自動化,比如建立每日構建系統、自動產生發布檔案等等。這些都需要我們對Android工程的編譯和打包有一個深入的理解,至少要知道它的每一步都做了什麼,需要什麼環境和工具,輸入和輸出是什麼。那麼我們就來挖掘一下Android的編譯過程中的細節。

首先,我們假定你的系統(什麼系統都行,不限於Linux還是Windows系統,當然,我在這裡預設使用Linux系統來舉例子,但在 Windows中幾乎沒有什麼差別)已經安裝了JDK和Android SDK。再假定你的Android SDK的路徑是ANDROID_SDK_HOME,你想要編譯的Android OS版本是ANDROID_OS_VERSION(比如android-1.6、android-8、android-10等)。

我們重點關心的是(1)這個過程的輸入是什嗎?(2)這個過程的輸出是什嗎?(3)這個過程使用了什麼工具?至於使用什麼參數,可以自己去看對應命令的協助檔案,或者在網上搜尋,這不是本文的重點。

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

名稱 功能介紹 在作業系統中的路徑
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,下同)。

第二步:處理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++開發的話)
【輸出】未簽名的.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以下。當然,還可以做很多事情,前提是你真正弄懂了它。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.