Android编译系统详解(三)
++++++++++++++++++++++++++++++++++++++++++
本文系本站原创,欢迎转载! 转载请注明出处:
http://blog.csdn.net/mr_raptor/article/details/7540730
++++++++++++++++++++++++++++++++++++++++++
Android编译系统详解(一):http://blog.csdn.net/mr_raptor/article/details/7539978
Android编译系统详解(二):http://blog.csdn.net/mr_raptor/article/details/7540066
Android编译系统详解(三):http://blog.csdn.net/mr_raptor/article/details/7540730
前面两节讲解了自定义Android编译项和创建Product产品配置文件,除了编译和定义产品相关环境变量外,还需要定义Board相关环境变量。
1.build/core/config.mk
[plain] view plain copy
- 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变量:
$(wildcard xxx)函数就是找到与xxx的匹配项放到空格列表里,前面定义TARGET_DEVICE变量 =fs100,所以$(SRC_TARGET_DIR)/board/fs100/BoardConfig.mk不存在,必须要存在vendor/*/fs1 00/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
[plain] view plain copy
- 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
[plain] view plain copy
- 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
由此可见:我们必须要在产品目录下创建AndrodiBoard.mk文件,来描述开发板相关配置项,我们可以借鉴:build/target/board/generic/AndroidBoard.mk内容,同时根据前面所分析,还要创建BoardConfig.mk文件。
[plain] view plain copy- $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/product product config
build/target/board board config
build/core/combo build flags config
这里解释下这里的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,在里面添加上自己的产品编译项
[plain] view plain copy- $mkdirvendor/farsight/
- $touchvendor/farsight/vendorsetup.sh
- $echo"add_lunch_combofs100-eng">vendor/farsight/vendorsetup.sh
2.仿着Android示例代码,在公司目录下创建products目录
[plain] view plain copy- $mkdir-pvendor/farsight/products
3.仿着Android示例代码,在products目录下创建两个mk文件
[plain] view plain copy- $touchvendor/farsight/products/AndroidProduct.mkvendor/farsight/products/fs100.mk
在AndroidProduct.mk里添加如下内容:
[plain] view plain copy
- PRODUCT_MAKEFILES:=$(LOCAL_DIR)/fs100.mk
在产品配置文件里添加最基本信息
[plain] view plain copy- $(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,创建对应文件。
[plain] view plain copy- $cpbuild/target/board/generic/AndroidBoard.mkbuild/target/board/generic/BoardConfig.mkvendor/farsight/fs100/
更多相关文章
- Android 下载文件至SD卡,并用progressBar显示下载进度
- android AlertDialog自定义全屏显示
- Android--取出SDcard卡上指定后缀名的文件
- AndroidManifest.xml文件详解(service)
- Android 自定义标题栏Title Bar
- Android 实现 选择文件对话框
- Toast大全(默认,顶部,底部,各种自定义) Android
- Android 自定义APP开机启动,并打开其它App