android 4.2编译,Android4.2的源码编译的小问题

Android4.2的源碼Build/prduct_config.mk裏面遇到幾個疑惑:

# Convert a short name like "sooner" into the path to the product

# file defining that product.

#

INTERNAL_PRODUCT := $(call resolve-short-product-name, $(TARGET_PRODUCT))

ifneq ($(current_product_makefile),$(INTERNAL_PRODUCT))

$(error PRODUCT_NAME inconsistent in $(current_product_makefile) and $(INTERNAL_PRODUCT))

endif

current_product_makefile :=

all_product_makefiles :=

all_product_configs :=

# Find the device that this product maps to.

TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)

按道理Makefile在讀取product_config.mk文件時,TARGET_DEVICE第壹感覺就該被理解我壹個合成的變量,當然這是Makefile的原理。但是這裏發現卻不是,為什麽?因為引入了壹個node_fns.mk文件。該文件的作用類似規定下完開始的content應該按照它的邏輯來處理,就好像比如定義了壹種宏形式,那麽接著的變量處理實際會變為另壹中處理方式:

74ce260b3c33dbde56793f4e613fd96d.png

比如這裏實際:

INTERNAL_PRODUCT = device/softwinner/fiber-3g/fiber_3g.mk

TARGET_DEVICE = fiber-3g

說實話自己也不是很理解node_fns.mk的作用,就把他理解為壹個定義了好多宏的頭文件吧。

看了下老羅的Android之旅,收獲了很對。上述的內容實質就是$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)是壹個全新的變量。通過對AndroidProducts.mk的內容進行分析,然後加上不同的_product_var_list ,這樣就可以生成全新的變量,都是根據不同的自己定制的產品來生成的。如下的變量就變成了上面提到的TARGET_DEVICE,其實質是在AndroidProducts.mk裏面進行了定義而已:

# Overrides

PRODUCT_BRAND := Softwinner

PRODUCT_NAME := fiber_3g

PRODUCT_DEVICE := fiber-3g

PRODUCT_MODEL := Softwinn

PRODUCTS.build/target/product/full.mk.PRODUCT_NAME := fiber_3g

PRODUCTS.build/target/product/full.mk.PRODUCT_DEVICE := fiber-3g

_product_var_list :=

PRODUCT_NAME

PRODUCT_MODEL

PRODUCT_LOCALES

PRODUCT_AAPT_CONFIG

PRODUCT_AAPT_PREF_CONFIG

PRODUCT_PACKAGES

PRODUCT_PACKAGES_DEBUG

PRODUCT_PACKAGES_ENG

PRODUCT_PACKAGES_TESTS

PRODUCT_DEVICE

PRODUCT_MANUFACTURER

PRODUCT_BRAND

PRODUCT_PROPERTY_OVERRIDES

PRODUCT_DEFAULT_PROPERTY_OVERRIDES

PRODUCT_CHARACTERISTICS

PRODUCT_COPY_FILES

PRODUCT_OTA_PUBLIC_KEYS

PRODUCT_EXTRA_RECOVERY_KEYS

PRODUCT_PACKAGE_OVERLAYS

DEVICE_PACKAGE_OVERLAYS

PRODUCT_TAGS

PRODUCT_SDK_ADDON_NAME

PRODUCT_SDK_ADDON_COPY_FILES

PRODUCT_SDK_ADDON_COPY_MODULES

PRODUCT_SDK_ADDON_DOC_MODULES

PRODUCT_DEFAULT_WIFI_CHANNELS

PRODUCT_DEFAULT_DEV_CERTIFICATE

PRODUCT_RESTRICT_VENDOR_FILES

PRODUCT_VENDOR_KERNEL_HEADERS

PRODUCT_FACTORY_RAMDISK_MODULES

PRODUCT_FACTORY_BUNDLE_MODULES

對於Android系統中的.mk文件可以在source /build/envsetup.sh後進行調用。比如:

function get_build_var(){

T=$(gettop)

if [ ! "$T" ]; then

echo "Couldn't locate the top of the tree. Try setting TOP." >&2

return

fi

CALLED_FROM_SETUP=true BUILD_SYSTEM=build/core

make --no-print-directory -C "$T" -f build/core/config.mk dumpvar-$1

}

該腳本函數就會被在lunch 選擇時,進行chenk products的操作,進壹步執行get_build_var TARGET_DEVICE的函數處理。其實質是執行了壹次Make的操作。看上去和系統編譯的Make -j8等完全類似。只是他執行了的只有config.mk配置相關的內容而已。進壹步依次執行envsetup.mk,到product_config.mk,最終獲得TARGET_DEVICE變量的內容。

6.$DEVICE變量的生成過程,其實就是文件fiber-3g所在的路徑:首先通過source envsetup.sh將所有的device和vendor下的vendorsetup.sh加進來,並完成combo的整合。lunch函數選擇對應的平臺後,並會設置好所有編譯所需的環境變量使用下面函數來完成:#設置環境變量set_stuff_for_environment#打印最終的配置信息printconfigset_stuff_for_environment的setpath函數中,該函數會export很多的環境路徑,供後續腳本函數執行調用有包括export DEVICE的導入:tdevice=$(get_build_var TARGET_DEVICE)

export DEVICE=$T/device/*/$tdevice

如下自定義Android編譯項和創建Product產品配置文件,Board板級配置文件:7 lunch過程確定了TARGET_PRODUCT = fiber_3g的內容;8 TARGET_DEVICE=fiber-3g,在build/core/product_config.mk中根據PRODUCT_DEVICE來確定。通過遍歷所有device目錄下的AndroidProducts.mk中的引入的.mk文件,比如這裏指fiber_3g.mk。通過TARGET_PRODUCT 來匹配查找到對應的AndroidProducts.mk。而PRODUCT_DEVICE在fiber_3g.mk中被確定為fiber-3g。通過node_fns.mk的宏作用,進而確定TARGET_DEVICE的內容為fiber-3g。9.Boardconfig.mk的作用。build/core/config.mk來決定。通過遍歷device/*/$(TARGET_DEVICE)/boardconfig.mk來完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值