Android編譯系統(tǒng)-下

上面我們提到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-user
    • add_lunch_combo mi6_best-userdebug
    • add_lunch_combo mi6_bset-eng

這樣就把我們自己的產(chǎn)品添加到編譯系統(tǒng)中了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容