2011年3月8日 星期二

淺談 build/envsetup.sh

在Android build system過程,經常會使用到 " source build/envsetup.sh " 這個指令(註1),"淺談"的話...相對的會對於這部分我也尚在摸索當中,今天找個時間整理了一下關於這部分的相關學習資訊與筆記分享一下。

Android原始碼在build目錄下有一個 envsetup.sh的shell script,該shell script定義了編譯前一些函數及進行編譯的程序;
可以在如下所示使用help看到相關函數說明:


一般常用的是lunch函數提供了一個功能表,讓開發人員選擇需要編譯的target product,並且設定好了相關環境參數及進行檢查,最後再列出編譯的主要環境參數。


上圖是Android原始碼最近更新後的版本畫面,從該畫面中可以看出取前面幾個版本的內容已經不同,而且除了ARM系統外已經看到加入了X86的系統。
除了lunch函數,choosecombo函數也有異曲同工的功能:


choosecombo函數比較特別的地方在於第三個選項 " Which product would you like? [full] ",這部分的參數可以參考build/target/product目錄下的mk檔案內容,
舉例來說如果我要一個精簡型的瘦身系統,那麼我可以在這個項目輸入generic,如果是還要更精簡的輸入core;
其中所安裝的內容部分,打開相關的檔案內容見PRODUCT_PACKAGES參數。例如generic.mk :
PRODUCT_PACKAGES := \
AccountAndSyncSettings \
DeskClock \
AlarmProvider \
Bluetooth \
Calculator \
Calendar \
Camera \
CertInstaller \
DrmProvider \
Email \
Gallery3D \
LatinIME \
Launcher2 \
Mms \
Music \
Provision \
Protips \
QuickSearchBox \
Settings \
Sync \
SystemUI \
Updater \
CalendarProvider \
SyncProvider

因此,除了core、generic、full以外,還有關於languages、locales、sim(模擬器)及X86系統的設定參數,詳細參考build/target/product目錄下mk檔案。

當持行完lunch或choosecombo函數後,可以使用Linux的 env指令看到已經有設定好的ANDROID參數,接著開始編譯就可以順利完成原始碼編譯。

如果要追蹤一下lunch或choosecombo函數可以在 build/envsetup.sh 中 function lunch() 或function choosecombo()部分。
例如: function lunch() --> function printconfig() --> build/core/config.mk --> build/core/envsetup.mk

還有如果要在原始碼中加入3-Party硬體部分設定,先前的版本是放在vendor目錄下,不過新版的目錄已經改成device,該目錄下有一個sample可以當範本參考看看。

另外,常用的部分還有就是編譯模組(Compile Module)指令的部分,在help中說明得很清楚有 m 、mm 、 mmm,這三個函數通常使用在修改或debug原始碼後不想全部編譯時:
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.

舉例我只需要從新編譯 libjpeg.so :在原始碼的跟目錄下輸入 mmm external/jpeg/
同樣情況下,至於 mm 的使用方式是要進入模組目錄下 external/jpeg/ 直接輸入mm後就會開始編譯。
m的部分就是全部模組編譯了。

最後,別忘了在執行上述功能函數前,務必要先執行 source build/envsetup.sh

註1. 詳見:http://source.android.com/source/download.html 網頁內容中 "Building the code" 段落部分說明。

參考:
1. Android Build System : http://source.android.com/porting/build_system.html

沒有留言:

張貼留言