++++++++++++++++++++++++++++++++++++++++++

本文系本站原创,欢迎转载! 转载请注明出处:

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
  1. 109#---------------------------------------------------------------
  2. 110#Definemostoftheglobalvariables.Thesearetheonesthat
  3. 111#arespecifictotheuser'sbuildconfiguration.
  4. 112include$(BUILD_SYSTEM)/envsetup.mk
  5. 113
  6. 114#Boardsmaybedefinedunder$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)
  7. 115#orundervendor/*/$(TARGET_DEVICE).Searchinbothplaces,but
  8. 116#makesureonlyoneexists.
  9. 117#RealboardsshouldalwaysbeassociatedwithanOEMvendor.
  10. 118board_config_mk:=\
  11. 119$(strip$(wildcard\
  12. 120$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk\
  13. 121vendor/*/$(TARGET_DEVICE)/BoardConfig.mk\
  14. 122))
  15. 123ifeq($(board_config_mk),)
  16. 124$(errorNoconfigfilefoundforTARGET_DEVICE$(TARGET_DEVICE))
  17. 125endif
  18. 126ifneq($(words$(board_config_mk)),1)
  19. 127$(errorMultipleboardconfigfilesforTARGET_DEVICE$(TARGET_DEVICE):$(board_config_mk))
  20. 128endif
  21. 129include$(board_config_mk)
  22. 130TARGET_DEVICE_DIR:=$(patsubst%/,%,$(dir$(board_config_mk)))
  23. 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
  1. 141#Bringinstandardbuildsystemdefinitions.
  2. 142include$(BUILD_SYSTEM)/definitions.mk
  3. ...
  4. 347ifeq($(SDK_ONLY),true)
  5. 348
  6. 349#-----SDKforWindows------
  7. 350#TheseconfigurethebuildtargetsthatareavailablefortheSDKunderCygwin.
  8. 351#ThefirstsectiondefinesalltheC/C++toolsthatcanbecompiledunderCygwin,
  9. 352#thesecondsectiondefinesalltheJavaones(assumingjavacisavailable.)
  10. 353
  11. 354subdirs:=\
  12. 355prebuilt\
  13. 356build/libs/host\
  14. 357build/tools/zipalign\
  15. ...
  16. 382#Thefollowingcanonlybebuiltif"javac"isavailable.
  17. 383#ThischeckisusedwhenbuildingpartsoftheSDKunderCygwin.
  18. 384ifneq(,$(shellwhichjavac2>/dev/null))
  19. 385$(warningsdk-only:javacavailable.)
  20. 386subdirs+=\
  21. 387build/tools/signapk\
  22. 388dalvik/dx\
  23. 389dalvik/libcore\
  24. ...
  25. 414else#!SDK_ONLY
  26. 415ifeq($(BUILD_TINY_ANDROID),true)
  27. 416
  28. 417#TINY_ANDROIDisasuper-minimalbuildconfiguration,handyforboard
  29. 418#bringupandverylowleveldebugging
  30. 419
  31. 420subdirs:=\
  32. 421bionic\
  33. 422system/core\
  34. 423build/libs\
  35. 424build/target\
  36. ...
  37. 433else#!BUILD_TINY_ANDROID
  38. 434
  39. 435#
  40. 436#Typicalbuild;includeanyAndroid.mkfileswecanfind.
  41. 437#
  42. 438subdirs:=$(TOP)
  43. 439
  44. 440FULL_BUILD:=true
  45. 441
  46. 442endif#!BUILD_TINY_ANDROID
  47. 443
  48. 444endif#!SDK_ONLY
  49. ...
  50. 464#
  51. 465#Includeallofthemakefilesinthesystem
  52. 466#
  53. 467
  54. 468#Can'tusefirst-makefiles-underherebecause
  55. 469#--mindepth=2makestheprunesnotwork.
  56. 470subdir_makefiles:=\
  57. 471$(shellbuild/tools/findleaves.py--prune=out--prune=.repo--prune=.git$(subdirs)Android.mk)
  58. 472
  59. 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
  1. 26ifeq(,$(wildcard$(TARGET_DEVICE_DIR)/AndroidBoard.mk))
  2. 27ifeq(,$(wildcard$(TARGET_DEVICE_DIR)/Android.mk))
  3. 28$(errorMissing"$(TARGET_DEVICE_DIR)/AndroidBoard.mk")
  4. 29else
  5. 30#TODO:Removethischeckafterpeoplehavehadachancetoswitch,
  6. 31#afterApril2009.
  7. 32$(errorPleaserename"$(TARGET_DEVICE_DIR)/Android.mk"to"$(TARGET_DEVICE_DIR)/AndroidBoard.mk")
  8. 33endif
  9. 34endif
  10. 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文件。

[plain] view plain copy
  1. $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
  1. $mkdirvendor/farsight/
  2. $touchvendor/farsight/vendorsetup.sh
  3. $echo"add_lunch_combofs100-eng">vendor/farsight/vendorsetup.sh

2.仿着Android示例代码,在公司目录下创建products目录

[plain] view plain copy
  1. $mkdir-pvendor/farsight/products

3.仿着Android示例代码,在products目录下创建两个mk文件

[plain] view plain copy
  1. $touchvendor/farsight/products/AndroidProduct.mkvendor/farsight/products/fs100.mk

在AndroidProduct.mk里添加如下内容:

[plain] view plain copy
  1. PRODUCT_MAKEFILES:=$(LOCAL_DIR)/fs100.mk

在产品配置文件里添加最基本信息

[plain] view plain copy
  1. $(callinherit-product,build/target/product/generic.mk)
  2. #Overrides
  3. PRODUCT_MANUFACTURER:=farsight
  4. PRODUCT_NAME:=fs100
  5. PRODUCT_DEVICE:=fs100

4.借鉴build/target/board/generic/AndroidBoard.mk和BoardConfig.mk,创建对应文件。

[plain] view plain copy
  1. $cpbuild/target/board/generic/AndroidBoard.mkbuild/target/board/generic/BoardConfig.mkvendor/farsight/fs100/

更多相关文章

  1. Android 下载文件至SD卡,并用progressBar显示下载进度
  2. android AlertDialog自定义全屏显示
  3. Android--取出SDcard卡上指定后缀名的文件
  4. AndroidManifest.xml文件详解(service)
  5. Android 自定义标题栏Title Bar
  6. Android 实现 选择文件对话框
  7. Toast大全(默认,顶部,底部,各种自定义) Android
  8. Android 自定义APP开机启动,并打开其它App

随机推荐

  1. Android中Toast显示时间的自定义
  2. 简谈WP,IOS,Android智能手机OS
  3. 在Android里如何判断一个指定的经纬度点
  4. Android(安卓)API Guides---Verifying Ap
  5. android安全问题(二) 程序锁
  6. 目前 Android平板所面临的几个问题
  7. [置顶] Android补间动画,属性动画实现购物
  8. android4技术详解-系统配置的响应
  9. 基于Android(安卓)Studio实现的2048游戏
  10. Android(安卓)6.0新特性之WebView不能适