首先来看下mma
的代码实现(build/envsetup.sh中):
function mma()
{
local T=$(gettop)
local DRV=$(getdriver $T)
if [ -f build/core/envsetup.mk -a -f Makefile ]; then
$DRV make $@
else
if [ ! "$T" ]; then
echo "Couldn't locate the top of the tree. Try setting TOP."
return 1
fi
local M=$(findmakefile)
# Remove the path to top as the makefilepath needs to be relative
local M=`echo $M|sed 's:'$T'/::'`
local MODULES_IN_PATHS=MODULES-IN-$(dirname ${M})
# Convert "/" to "-".
MODULES_IN_PATHS=${MODULES_IN_PATHS//\//-}
$DRV make -C $T -f build/core/main.mk $@ $MODULES_IN_PATHS
fi
}
代码的最后会调用build/core/main.mk
文件.
main.mk文件里定义了整个Android的编译关系.
它主要引入了下列几个重要的mk文件:
其中定义了一个默认的droid,当我们在TOP目录下,敲Make实际上就等同于我们执行make droid。
还有一些编译时需要用到的变量:TOP
,TOPDIR
.
当Make include所有的文件,完成对所有make文件的解析以后就会寻找生成droid的规则,依次生成它的依赖,直到所有满足的模块被编译好,然后使用相应的工具打包成相应的img。
其中,config.mk,envsetup.mk,product_config.mk文件是编译用户指定平台系统的关键文件。
main.mk
中:
37 BUILD_SYSTEM := $(TOPDIR)build/core
49 include $(BUILD_SYSTEM)/config.mk
文件中定义各种编译使用的变量:
其中:
CLEAR_VARS
就是用来清除之前定义的环境变量
BUILD_HOST_SHARED_LIBRARY
就是用来编译动态库的环境变量
其后有包含了一个重要文件envsetup.mk
:
181 # ---------------------------------------------------------------
182 # Define most of the global variables. These are the ones that
183 # are specific to the user's build configuration.
184 include $(BUILD_SYSTEM)/envsetup.mk
包含main.mk
文件的是envsetup.sh
脚本文件,这个叫做envsetup.mk
.O(∩_∩)O差点傻傻分不清楚..
其中:
187 # Read the product specs so we can get TARGET_DEVICE and other
188 # variables that we need in order to locate the output files.
189 include $(BUILD_SYSTEM)/product_config.mk
会调用product_config.mk
文件.
该文件中:
173 # ---------------------------------------------------------------
174 # Include the product definitions.
175 # We need to do this to translate TARGET_PRODUCT into its
176 # underlying TARGET_DEVICE before we start defining any rules.
177 #
178 include $(BUILD_SYSTEM)/node_fns.mk
179 include $(BUILD_SYSTEM)/product.mk
180 include $(BUILD_SYSTEM)/device.mk
包含了文件product.mk
.
product.mk文件主要作用是:
如果个人想个性定制自己的产品,应该有以下流程: 1. 创建公司目录
mkdir vendor/helloworld
2. 创建一个vendorsetup.sh文件,将当前产品编译项添加到lunch里,让lunch能找到用户个性定制编译项
echo "add_lunch_combo helloworld-eng" > vendor/helloworld/vendorsetup.sh
3. 仿着Android示例代码,在公司目录下创建products目录
mkdir -p vendor/helloworld/products
4. 仿着Android示例代码,在products目录下创建两个mk文件
touch vendor/helloworld/products/AndroidProduct.mk vendor/helloworld/products/helloworld.mk
在AndroidProduct.mk里添加如下内容:
PRODUCT_MAKEFILES := $(LOCAL_DIR)/helloworld.mk
表示只有一个产品helloworld,它对应的配置文件在当前目录下的helloworld.mk。
5. 在产品配置文件里添加最基本信息