上面我们提到main.mk是我们编译流程的入口。那么要把整个Android编译完成,这个main.mk肯定include了很多其他的makefile。
为了证实我们这个猜想,我们在main.mk中搜索include关键字,看一下它都include了哪些makefile
- include config.mk
- -include vendor/google/build/config.mk
- include definitions.mk
- 寻找所有目录下的Android.mk文件
从上面可以看到,如果我们要集成google的GMS包,要放在vendor目录下。
definitions.mk的主要作用是定义一些我们在Android.mk中要使用到的方法,比如all-subdir-makefiles
这个方法就是在definitions.mk中定义的。
下面来讲一下config.mk,这是Android编译系统中很重要的一个makefile。
这个config.mk主要做三方面的工作:
-
把各种文件定义成宏,比如我们在编译apk的时候要调用BUILD_PACKAGE这个宏,这个宏对应package.mk,他还把一些工具也定义成宏,比如AAPT代表打包工具aapt。
-
inculde envsetup.mk,这个envsetup.mk会调用product.mk来查找AndroidProduct.mk
$(shell test -d device && find device -maxdepth 6 -name AndroidProducts.mk) \ $(shell test -d vendor && find vendor -maxdepth 6 -name AndroidProducts.mk) \ $(SRC_TARGET_DIR)/product/AndroidProducts.mk
也就是说会从device和vendor目录6层之内去寻找AndroidProduct.mk,这个AndroidProduct.mk有什么作用呢?
AndroidProdcut.mk中定义了编译过程中需要的各种信息,比如输出路径Product_Out等。
-
查找BoardConfig.mk
board_config_mk := \ $(strip $(wildcard \ $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk \ $(shell test -d device && find device -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ $(shell test -d vendor && find vendor -maxdepth 4 -path '*/$(TARGET_DEVICE)/BoardConfig.mk') \ ))
从上面可以看出,会从vendor和devicem目录下的四层文件夹之内寻找对应Target_Device的BoardConfig.mk,因为BoardConfig是对应板级配置,所以必须和Device对应。
现在我们已经知道了要编译的产品,对应的Device已经板级配置,已经安装路径,和所有的Module(Android.mk),接下来就是正常的编译过程了。
我们以一个例子来结束
假设我们公司叫做 大米,Product名字叫做mi6,Device那么叫做best
,那么lunch菜单应该是mi6_best-user或者mi6_best-userdebug.
那怎么把我们的产品加到编译系统中呢?
-
在vendor下建立我们自己的目录vendor/dami/mi6/best
- 这里要注意,文件夹的名字必须是best,这是和我们的设备对应的。
-
在best目录下建立AndroidProduct.mk,BoardConfig.mk,vendorsetup.sh,mi6_best.mk
- 其中AndroidProduct.mk用来设置编译产品的过程中必须的变量,比如产品的输出路径等。
- BoardConfig.mk用来设置对应的Device的板级配置,我们这里只是演示,所以这个文件内容为空。
- vendorsetup.sh用来把Product和Device添加到lunch菜单
- mi6_best.mk是我们产品自己的makefile,我们对于自己的产品有什么设置,可以在这个里面增加
-
由于AndroidProduct.mk是我们产品总的makefile,所以我们把我们自己的mi6_best添加到这里
- PRODUCT_MAKEFILES := $(LOCAL_DIR)/mi6_best.mk
-
在mi6_best.mk中增加Product相关的配置
- Product_Name := mi6
- Product_Device := best
-
修改vendorsetup.sh增加如下
add_lunch_combo mi6_best-user
add_lunch_combo mi6_best-userdebug
add_lunch_combo mi6_bset-eng
这样就把我们自己的产品添加到编译系统中了。
网友评论