Android101110: Android Make腳本的簡記(3)(轉)


Email:    [email protected]
Blog    http://zcatt.cublog.cn

 
內容提要
文檔簡要整理Android的make腳本的內容。以供備忘和參考。



聲明
僅限學習交流,禁止商業用途。轉載需註明出處。


版本記錄
Date    Ver    Note
2010-11-10    0.1    Draft.  zcatt@Beijing
2010-11-11    0.2 add inherit-product

1.    findleaves.py的分析


main.mk中調用了findleaves.py,得到所有子目錄下Android.mk文件的路徑。
subdir_makefiles := /
    $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk)
$(subdirs)一般編譯中取值$(TOP)。

使用方法,
Usage: %(progName)s [<options>] <dirlist> <filename>
Options:
   --mindepth=<mindepth>
       Both behave in the same way as their find(1) equivalents.
   --prune=<dirname>
       Avoids returning results from inside any directory called <dirname>
       (e.g., "*/out/*"). May be used multiple times.

程序首先依次選取dirlist中的目錄,然後遍歷所有子目錄查找Android.mk文件,如果有,則加入到返回列表中。

2. pathmap.mk的分析


pathmap.mk 中定義了一個列表pathmap_INCL,列表中每項是"短名:路徑"對。命令include-path-for使用這個pathmap_INCL列 表,輸入短名,得到路徑。你可以在這個列表中添加自己的對。使用$(call include-path-for, <短名>)就可以得到路徑。
另外,定義了FRAMEWORKS_BASE_JAVA_SRC_DIRS,含有frameworks/base目錄下含java文件的所有目錄。

3. config.mk的分析


首先,包含pathmap.mk, 其次,定義了一些變量,例如通用的編譯參數,package的後綴名等。
隨後包含buildspec.mk。
接着包含envsetup.mk。
然 後包含$(board_config_mk)。$(board_config_mk)是位於build/target/board /$(TARGET_DEVICE)/,device/*/$(TARGET_DEVICE)/,或vendor/*/$(TARGET_DEVICE) /目錄下的BoardConfig.mk文件。

-------TODO

4. buildspec.mk的分析


buildspec.mk是用戶應當配置的腳本文件,模板可以使用buildspec.mk.default,放到$(TOP)下。
在 buildspec.mk中,用戶應該配置好主要的參數,例如 TARGET_PRODUCT, TARGET_BUILD_VARIANT, CUSTOM_MODULES,  TARGET_SIMULATOR, TARGET_BUILD_TYPE, CUSTOM_LOCALES, 和BUILD_ENV_SEQUENCE_NUMBER等。
如果不使用buildspec.mk配置參數,也可以使用環境變量的形式。若不配置參數,那麼android會使用默認的參數。

5. envsetup.mk的分析


首先包含進version_defaults.mk,定義好一些版本相關的變量。參見version_defaults.mk。

定義CORRECT_BUILD_ENV_SEQUENCE_NUMBER,這個數字用於buildspec.mk更新時的提醒,應該同buildspec.mk中的或環境變量中的BUILD_ENV_SEQUENCE_NUMBER相等。一般不用關注。

隨後檢查TARGET_PRODUCT,若爲空,則置generic。TARGET_PRODUCT應當在buildspec.mk或環境變量中已經定義好。

再檢查TARGET_BUILD_VARIANT,若爲空,則置eng。TARGET_BUILD_VARIANT應當在buildspec.mk或環境變量中已經定義好。

然後包含進product_config.mk。

接着,檢查$(TARGET_BUILD_VARIANT),取值範圍是eng user userdebug tests。

隨後判定HOST_OS(linux),HOST_ARCH(x86)

接着,確定TARGET_ARCH和TARGET_OS,若沒有定義,則取默認值。
TARGET_ARCH := arm
TARGET_OS := linux

接着,確定TARGET_BUILD_TYPE,若沒有定義,則取默認值。
TARGET_BUILD_TYPE := release

接着,確定OUT_DIR。OUT_DIR是存放中間文件和最終結果的地方。若沒有定義,則取默認值。
OUT_DIR := $(TOPDIR)out

隨後,定義了一些列的路徑變量
DEBUG_OUT_DIR,TARGET_OUT_ROOT_release,TARGET_OUT_ROOT_debug,TARGET_OUT_ROOT,BUILD_OUT,PRODUCT_OUT,TARGET_COMMON_OUT_ROOT,等等。

6. version_defaults.mk的分析


version_defaults.mk是檢查一些跟版本相關的變量是否定義,如果未定義,則使用默認值。這些變量包括
PLATFORM_VERSION,默認AOSP
PLATFORM_SDK_VERSION,默認8
PLATFORM_VERSION_CODENAME,默認AOSP
DEFAULT_APP_TARGET_SDK,默認AOSP
BUILD_ID,默認UNKNOWN
BUILD_NUMBER,默認eng.$(USER).$(shell date +%Y%m%d.%H%M%S)的形式。


version_defaults.mk首先包含進build_id.mk。用戶應當配置build_id.mk,而不應該改動version_defaults.mk文件。
然後檢查上述變量,如未定義則賦值默認值。

7. build_id.mk的分析


用戶可以在build_id.mk中定義這樣幾個參數,
PLATFORM_VERSION
PLATFORM_SDK_VERSION
PLATFORM_VERSION_CODENAME
DEFAULT_APP_TARGET_SDK
BUILD_ID
BUILD_NUMBER
這些參數最終將出現build.prop中。

Froyo的build_id.mk中定義了2個變量,
BUILD_ID,通常用於說明分支branch的,默認的是OPENMASTER,用戶應該配置這個參數。
DISPLAY_BUILD_NUMBER, 在TARGET_BUILD_VARIANT=user的版本中,build.prop中是ro.build.id是顯示 成$(BUILD_ID).$(BUILD_NUMBER),還是顯示成$(BUILD_ID)形式。設成true,則顯示前者。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章