上面我們提到main.mk是我們編譯流程的入口。那么要把整個Android編譯完成,這個main.mk肯定include了很多其他的makefile。
為了證實我們這個猜想,我們在main.mk中搜索include關(guān)鍵字,看一下它都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編譯系統(tǒng)中很重要的一個makefile。
這個config.mk主要做三方面的工作:
把各種文件定義成宏,比如我們在編譯apk的時候要調(diào)用BUILD_PACKAGE這個宏,這個宏對應(yīng)package.mk,他還把一些工具也定義成宏,比如AAPT代表打包工具aapt。
-
inculde envsetup.mk,這個envsetup.mk會調(diào)用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層之內(nèi)去尋找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目錄下的四層文件夾之內(nèi)尋找對應(yīng)Target_Device的BoardConfig.mk,因為BoardConfig是對應(yīng)板級配置,所以必須和Device對應(yīng)。
現(xiàn)在我們已經(jīng)知道了要編譯的產(chǎn)品,對應(yīng)的Device已經(jīng)板級配置,已經(jīng)安裝路徑,和所有的Module(Android.mk),接下來就是正常的編譯過程了。
我們以一個例子來結(jié)束
假設(shè)我們公司叫做 大米,Product名字叫做mi6,Device那么叫做best
,那么lunch菜單應(yīng)該是mi6_best-user或者mi6_best-userdebug.
那怎么把我們的產(chǎn)品加到編譯系統(tǒng)中呢?
-
在vendor下建立我們自己的目錄vendor/dami/mi6/best
- 這里要注意,文件夾的名字必須是best,這是和我們的設(shè)備對應(yīng)的。
-
在best目錄下建立AndroidProduct.mk,BoardConfig.mk,vendorsetup.sh,mi6_best.mk
- 其中AndroidProduct.mk用來設(shè)置編譯產(chǎn)品的過程中必須的變量,比如產(chǎn)品的輸出路徑等。
- BoardConfig.mk用來設(shè)置對應(yīng)的Device的板級配置,我們這里只是演示,所以這個文件內(nèi)容為空。
- vendorsetup.sh用來把Product和Device添加到lunch菜單
- mi6_best.mk是我們產(chǎn)品自己的makefile,我們對于自己的產(chǎn)品有什么設(shè)置,可以在這個里面增加
-
由于AndroidProduct.mk是我們產(chǎn)品總的makefile,所以我們把我們自己的mi6_best添加到這里
- PRODUCT_MAKEFILES := $(LOCAL_DIR)/mi6_best.mk
-
在mi6_best.mk中增加Product相關(guān)的配置
- Product_Name := mi6
- Product_Device := best
-
修改vendorsetup.sh增加如下
add_lunch_combo mi6_best-useradd_lunch_combo mi6_best-userdebugadd_lunch_combo mi6_bset-eng
這樣就把我們自己的產(chǎn)品添加到編譯系統(tǒng)中了。