【网学网提醒】:本文主要为网学会员提供android build子系统解析,希望对需要android build子系统解析网友有所帮助,学习一下!
AndroidBuildingSystem分析设定档Androidbuildingsystem包括几种重要的设定档,*Android.mk*AndroidProducts.mk*target_
-.mk,host_-.mkand-.mk*BoardConfig.mk*buildspec.mkAndroid.mk是module和package的设定档,每个module/package的目录下都会有一个Android.mk。所谓的module是指系统的nativecode,相对于用Java写成的Androidapplication称为package。AndroidProducts.mk则设定product配置。product即特定系统版本,透过编译不同product,产生不同软件配置内容,安装不同的application。Product可视为特定项目,产生特定规格系统。BoardConfig.mk是为product主板做设定,像是driver选择、设定。*-.mk则是针对选择的操作系统和CPU架构,进行相关设定。buildspec.mk是位于source根目录下,为进行编译者所做之额外设定。例如,可在此选择要产生的product、平台、额外的module/package等。参数build/envsetup.sh实作一个mm指令,以编译单一module,不需编译整个sourcetree。ONE_SHOT_MAKEFILE这个makefile变量/参数就是用以实作这个功能。使用方法是在执行make时,将该变量指定为module的Android.mk。*makeONE_SHOT_MAKEFILE=透过定义CREATE_MODULE_INFO_FILE,buildingsystem会将所有module信息列在$(PRODUCT_OUT)/module-info.txt档案里。*makeCREATE_MODULE_INFO_FILE=true设定BUILD_TINY_ANDROID=true,buildingsystem产生一个简单的image,以测试硬件的可用度。此功能用于移植的早期阶段,以快速bringup。HOST_BUILD_TYPE和TARGET_BUILD_TYPE指定buildingsystem产生binary的目的为debug或release。透过设定此二变量,能产生包含debuginformation的binry。*debug*release
这些参数,也可设于buildspec.mk里,以避免开发过程不断的重新指定。Goals一般编辑整个Android系统,就是使用droid这个goal。droid会产生一个完整的系统,包括bootloader、kernel、系统程序、模块和应用程序。showcommands和droid功能相同,但droid在编译过程不显示所使用的指令。透过showcommands这个goal,buildingsystem显示过程中每一个步骤的详细指令。Makefile的流程*****初始化相关变数侦测编译环境和目标环境决定目标product读取product的设定读取product所指定之目标平台架构设定o选择toolchaino指定编译参数(*-.mk)清除输出目录设定/检查版本编号读取所有BoardConfig.mk档案读取所有module的设定根据设定,产生必需的rule产生image
******
以上的主要流程都是由build/core/main.mk所安排。初始化和侦测由build/core/config.mk所进行。build/core/envsetup.mk检查(buildspec.mk),并检查执行环
境,以决定输出目录、项目。developer的设定
build/core/config.mk本身还依据参数,决定解译时的相关参数。像是compiler的路径、flags,lex、yacc的路径参数等。关于product的相关设定,则是由build/core/product_config.mk所处理,使用build/core/product.mk提供之macro加载。根据AndroidProduct.mk的内容,product_config.mk决定了*PRODUCT_TAGS*OTA_PUBLIC_KEYS*PRODUCT_POLICY
*......Product设定的读取Androidproduct的设定来自于build/target/product/AndroidProduct.mk和vendor子目录下的AndroidProduct.mk。buildingsystem透过find指令,找出所有可能的AndroidProduct.mk。AndroidProduct.mk里定义PRODUCT_MAKEFILES变量,列举所有实际定义product的makefile。这些makefile各自定义独立的product。product相关参数,存成PRODUCTS..形式的变数。并将makefile路径存在PRODUCTS变量。因此,透过PRODUCTS能取得所有的product路径/名称,并透过PRODUCTS..形式的变量取得内容。Module设定的读取Module是指nativecode的软件组件,而Javaapplication则被称为package。build/core/definitions.mk定义module/package相关macro,读取、检查module/package定义档;分散sourcetree各处的Android.mk档案。build/core/main.mk使用find指令,在这些子目录下找出所有Android.mk,并将路径存在subdir_makefiles变量里。最后,include这些档案。这些Android.mk会include定义成变量BUILD_SHARED_LIBRARY、BUILD_PACKAGE等,和其目的相配的makefile。这些makefile会变Android.mk定义之内容,存成ALL_MODULES..形式。例如,Android.mk定义了LOCAL_MODULE_SUFFIX,变会存成ALL_MODULES..LOCAL_MODULE_SUFFIX。而Android.mk路径,当样会存于ALL_MODULES变量里。SearchAndroid.mk的路径,基本上会是整个sourcetree。但会依特定的goal,选择性只找寻特定目录。例如SDK只需特定目录下的Android.mk。BoardLevel设定和目标平台主板相关之设定,例如使用了什么装置、driver等,或是是否需要编译bootloader、kernel等,都是在BoardConfig.mk里设定。同样,每张主板可以有不同设定,存在不同目录下的BoardConfig.mk,以find寻找如下档案:*build/target/board/$(TARGET_DEVICE)/BoardConfig.mk*vendor/*/$(TARGET_DEVICE)/BoardConfig.mkTARGET_DEVICE是product所定义,因此同一个BoardConfig.mk可被多个product所使用。一个TARGET_DEVICE,通常只有一个BoardConfig.mk。BoardConfig.mk会被直接include到buildingsystem的namespace里。因此,一些module的enable/disable,可以在Boa
rdConfig.mk以对映不同的主板。
Rules在module的定义档Android.mk里,可定义module的tag,LOCAL_MODULE_TAGS,以分类这些module。每一个product可以指定需要的tag(PRODUCT_TAGS),使buildingsystem只编译标示这些tag的module。在build/core/main.mk里,所有标示特定tag的module收集为ALL_DEFAULT_INSTALLED_MODULES,并includebuild/core/Makefile处理。build/core/Makefile为这些module产生rule,并使产生image的goaldependon这些rule,使这些module被编译。