Android编译系统-下

上面我们提到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

这样就把我们自己的产品添加到编译系统中了。

你可能感兴趣的:(Android编译系统-下)