Android 專案編譯過程
Android 工程構建的持續整合,需要搭建一套編譯和打包自動化流程,比如建立每日構建系統、自動生成釋出檔案等等。這些都需要我們對Android工程的編譯和打包有一個比較深入的理解,例如知道它的每一步都做了什麼,需要什麼環境和工具,輸入和輸出是什麼,等等。
首先,假定你的系統(Windows、Linux、Mac OS都行,本文預設使用Ubuntu Linux系統來舉例子,但在 Windows中幾乎沒有什麼差別)已經安裝了JDK和Android SDK, 如果沒有安裝,可以參考Ubuntu搭建Eclipse+JDK+SDK的Android http://www.linuxidc.com/Linux/2011-11/46995.htm
再假定你的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檔案
【工具】dex工具
第五步:打包生成未簽名的.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以下。當然,還可以做很多事情,前提是你真正弄懂了它。
相關文章
- Android Makefile 編譯過程分析Android編譯
- vlc-android 的編譯過程Android編譯
- 編譯過程編譯
- Android Apk 檔案反編譯和重新打包的過程分析AndroidAPK編譯
- Javac編譯過程Java編譯
- 編譯核心過程編譯
- 編譯器的編譯基本過程編譯
- 淺談Android的資源編譯過程Android編譯
- 編譯連結過程編譯
- 編譯過程簡介編譯
- C++ 編譯過程C++編譯
- 深入wepy原始碼:wpy檔案編譯過程原始碼編譯
- 清理微控制器編譯過程中產生的編譯檔案(壓縮以減少專案體積)編譯
- ios底層 編譯過程iOS編譯
- 編譯器的工作過程編譯
- EVC編譯TCPMP的過程編譯TCP
- .NET 程式碼編譯過程編譯
- glade 編譯過程 (轉)編譯
- MDK編譯過程及檔案型別全解編譯型別
- GCC編譯過程(預處理->編譯->彙編->連結)GC編譯
- Java 原始碼編譯成 Class 檔案的過程分析Java原始碼編譯
- 使用plsql/devlop編譯過程hang住案列小結SQLdev編譯
- GCC編譯和連結過程GC編譯
- JavaScript的預編譯過程分析JavaScript編譯
- go語言編譯過程概述Go編譯
- 預編譯過程(AO+GO)編譯Go
- C程式編譯過程淺析C程式編譯
- 編譯C++ 程式的過程編譯C++
- Hive SQL 編譯過程詳解HiveSQL編譯
- C語言編譯全過程C語言編譯
- 儲存過程編譯時卡死儲存過程編譯
- Android 如何編寫基於編譯時註解的專案Android編譯
- 專案編譯報錯編譯
- Android 原始碼分析(一)專案構建過程Android原始碼
- [轉]:xmake編譯配置過程詳解編譯
- 詳解Linux 程式編譯過程Linux編譯
- 3- C語言編譯過程C語言編譯
- C語言編譯過程簡介C語言編譯