Android编译过程详解(三)
2012-07-28 18:19
405 查看
前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量。
1.build/core/config.mk
109#--------------------------------------------------------------- 110#Definemostoftheglobalvariables.Thesearetheonesthat 111#arespecifictotheuser'sbuildconfiguration. 112include$(BUILD_SYSTEM)/envsetup.mk 113 114#Boardsmaybedefinedunder$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE) 115#orundervendor/*/$(TARGET_DEVICE).Searchinbothplaces,but 116#makesureonlyoneexists. 117#RealboardsshouldalwaysbeassociatedwithanOEMvendor. 118board_config_mk:=\ 119$(strip$(wildcard\ 120$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk\ 121vendor/*/$(TARGET_DEVICE)/BoardConfig.mk\ 122)) 123ifeq($(board_config_mk),) 124$(errorNoconfigfilefoundforTARGET_DEVICE$(TARGET_DEVICE)) 125endif 126ifneq($(words$(board_config_mk)),1) 127$(errorMultipleboardconfigfilesforTARGET_DEVICE$(TARGET_DEVICE):$(board_config_mk)) 128endif 129include$(board_config_mk) 130TARGET_DEVICE_DIR:=$(patsubst%/,%,$(dir$(board_config_mk))) 131board_config_mk:=
上述代码在上一节已经见到过,只是分析了112行的envsetup.mk,根据上一节内容可知,envsetup.mk设置了很多OUT变量,最终在build/core/product_config.mk文件里,设置了TARGET_DEVICE=fs100。
我们从114行继续分析。
从114~117行解释大意可知:
Board相关配置文件会存在于$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/或vendor/*/$(TARGET_DEVICE)/目录中,一个Vendor厂商只能有一个对应的Board配置文件。
118行定义board_config_mk变量:
$(wildcardxxx)函数就是找到与xxx的匹配项放到空格列表里,前面定义TARGET_DEVICE变量=fs100,所以$(SRC_TARGET_DIR)/board/fs100/BoardConfig.mk不存在,必须要存在vendor/*/fs100/BoardConfig.mk文件来定义开发板配置信息。
129行,通过include将vendor/*/fs100/BoardConfig.mk包含进来,
130行,TARGET_DEVICE_DIR为board_config_mk的路径,即:vendor/*/fs100
总结:
一个vendor厂商必须要有一个对应的Board配置文件,即:vendor/*/fs100/BoardConfig.mk
定义了TARGET_DEVICE_DIR变量,为board_config_mk的路径,即:vendor/*/fs100
指定board相关特性,一定要包含:
TARGET_CPU_ABI:=armeabi/...
其他属性参见其他board样例.(build/target/board/XXX
2.build/core/main.mk
141#Bringinstandardbuildsystemdefinitions. 142include$(BUILD_SYSTEM)/definitions.mk ... 347ifeq($(SDK_ONLY),true) 348 349#-----SDKforWindows------ 350#TheseconfigurethebuildtargetsthatareavailablefortheSDKunderCygwin. 351#ThefirstsectiondefinesalltheC/C++toolsthatcanbecompiledunderCygwin, 352#thesecondsectiondefinesalltheJavaones(assumingjavacisavailable.) 353 354subdirs:=\ 355prebuilt\ 356build/libs/host\ 357build/tools/zipalign\ ... 382#Thefollowingcanonlybebuiltif"javac"isavailable. 383#ThischeckisusedwhenbuildingpartsoftheSDKunderCygwin. 384ifneq(,$(shellwhichjavac2>/dev/null)) 385$(warningsdk-only:javacavailable.) 386subdirs+=\ 387build/tools/signapk\ 388dalvik/dx\ 389dalvik/libcore\ ... 414else#!SDK_ONLY 415ifeq($(BUILD_TINY_ANDROID),true) 416 417#TINY_ANDROIDisasuper-minimalbuildconfiguration,handyforboard 418#bringupandverylowleveldebugging 419 420subdirs:=\ 421bionic\ 422system/core\ 423build/libs\ 424build/target\ ... 433else#!BUILD_TINY_ANDROID 434 435# 436#Typicalbuild;includeanyAndroid.mkfileswecanfind. 437# 438subdirs:=$(TOP) 439 440FULL_BUILD:=true 441 442endif#!BUILD_TINY_ANDROID 443 444endif#!SDK_ONLY ... 464# 465#Includeallofthemakefilesinthesystem 466# 467 468#Can'tusefirst-makefiles-underherebecause 469#--mindepth=2makestheprunesnotwork. 470subdir_makefiles:=\ 471$(shellbuild/tools/findleaves.py--prune=out--prune=.repo--prune=.git$(subdirs)Android.mk) 472 473include$(subdir_makefiles)
上一节只是讲了main.mk第49行中包含了config.mk,我们继续分析。
142行包含了:build/core/definitions.mk,该文件定义了很多全局变量与函数。
如下列常见函数:
my-dir:返回当前路径
all-java-files-under:获得指定目录及子目录一所有java文件
all-subdir-c-files:获得当前目录下及子目录下所有c文件
354~444行,定义了subdirs变量,依据不同的用户编译条件,而包含Android源码中不同的目录。
470行,定义了subdir_makefile变量,其值为subdirs定义的目录中的Android.mk文件。
473行,将所有编译目录中的Android.mk文件包含进来。
3.build/target/board/Android.mk
26ifeq(,$(wildcard$(TARGET_DEVICE_DIR)/AndroidBoard.mk)) 27ifeq(,$(wildcard$(TARGET_DEVICE_DIR)/Android.mk)) 28$(errorMissing"$(TARGET_DEVICE_DIR)/AndroidBoard.mk") 29else 30#TODO:Removethischeckafterpeoplehavehadachancetoswitch, 31#afterApril2009. 32$(errorPleaserename"$(TARGET_DEVICE_DIR)/Android.mk"to"$(TARGET_DEVICE_DIR)/AndroidBoard.mk") 33endif 34endif 35include$(TARGET_DEVICE_DIR)/AndroidBoard.mk
由于将所有目录中Android.mk文件include进来,build/target/board/Android.mk自然被包含进来,根据前面分析,TARGET_DEVICE_DIR=vendor/*/fs100,其中26~35行用来判断对应的产品目录下是否存在AndrodiBoard.mk,如果不存在,提示出错退出,如果存在,将其包含到编译脚本中。
由此可见:我们必须要在产品目录下创建AndrodiBoard.mk文件,来描述开发板相关配置项,我们可以借鉴:build/target/board/generic/AndroidBoard.mk内容,同时根据前面所分析,还要创建BoardConfig.mk文件。
$cpbuild/target/board/generic/AndroidBoard.mkbuild/target/board/generic/BoardConfig.mkvendor/farsight/fs100/
至此,自定义Android编译选项基本步骤已经分部分析完,细节还需要针对不同开发板具体分析。
总结:
build/core/main.mk包含了config.mk,它主要定义了编译全部代码的依赖关系
build/core/config.mk定义了大量的编译脚本命令,编译时用到的环境变量,引入了envsetup.mk文件,加载board相关配置文件。
build/core/envsetup.mk定义了编译时用到的大量OUT输出目录,加载product_config.mk文件
build/core/product_config.mk定义了Vendor目录下Product相关配置文件解析脚本,读取AndrodProducts.mk生成TARGET_DEVICE变量
build/target/productproductconfig
build/target/boardboardconfig
build/core/combobuildflagsconfig
这里解释下这里的board和product。borad主要是设计到硬件芯片的配置,比如是否提供硬件的某些功能,比如说GPU等等,或者芯片支持浮点运算等等。product是指针对当前的芯片配置定义你将要生产产品的个性配置,主要是指APK方面的配置,哪些APK会包含在哪个product中,哪些APK在当前product中是不提供的。
config.mk是一个总括性的东西,它里面定义了各种module编译所需要使用的HOST工具以及如何来编译各种模块,比如说BUILT_PREBUILT就定义了如何来编译预编译模块。envsetup.mk主要会读取由envsetup.sh写入环境变量中的一些变量来配置编译过程中的输出目录,combo里面主要定义了各种Host和Target结合的编译器和编译选项。
1.在vendor目录下创建自己公司目录,然后在公司目录下创建一个新的vendorsetup.sh,在里面添加上自己的产品编译项
$mkdirvendor/farsight/ $touchvendor/farsight/vendorsetup.sh $echo"add_lunch_combofs100-eng">vendor/farsight/vendorsetup.sh
2.仿着Android示例代码,在公司目录下创建products目录
$mkdir-pvendor/farsight/products
3.仿着Android示例代码,在products目录下创建两个mk文件
$touchvendor/farsight/products/AndroidProduct.mkvendor/farsight/products/fs100.mk
在AndroidProduct.mk里添加如下内容:
PRODUCT_MAKEFILES:=$(LOCAL_DIR)/fs100.mk
在产品配置文件里添加最基本信息
PRODUCT_PACKAGES:=\ IM\ VoiceDialer $(callinherit-product,build/target/product/generic.mk) #Overrides PRODUCT_MANUFACTURER:=farsight PRODUCT_NAME:=fs100 PRODUCT_DEVICE:=fs100
4.借鉴build/target/board/generic/AndroidBoard.mk和BoardConfig.mk,创建对应文件。
$cpbuild/target/board/generic/AndroidBoard.mkbuild/target/board/generic/BoardConfig.mkvendor/farsight/fs100/
相关文章推荐
- Android编译过程详解(三)
- Android编译过程详解(二)
- Android编译过程详解(一)
- android编译过程详解(一)
- Android编译过程详解(一)
- Android编译过程详解(二)
- Android编译过程详解
- Android编译过程详解
- Android编译过程详解(二)
- Android编译过程详解
- Android编译过程详解(二)
- Android编译过程详解(二)
- Android编译过程详解(三)
- Android编译过程详解(二)
- Android编译过程详解(一,二,三)
- Android编译过程详解(二)
- Android编译过程详解
- android编译过程详解(二)
- Android编译过程详解(三)
- Android编译过程详解(一)