1. 程式人生 > >Android集成一個新產品時,lunch的product name和device name註意事項

Android集成一個新產品時,lunch的product name和device name註意事項

相關 oca end col 全部 article cut 返回 開發


Android系統lunch一個當前的Product大概流程包括下面幾個部分:

1. lunch確定TARGET_PRODUCT。一般位於vendor/device/build/target/product中的vendorsetup.sh腳本來定義分別有user/eng/userdebug。

2. 開發check product的合理性。

通過載入vendor/device/build/target/product中的AndroidProduct.mk文件,記錄其包括的各個.mk文件以及其所在的路徑,作為當前的all_product_makefile.

通過選擇的TARGET_PRODUCT filter到current_prodcut_makefile.

197 current_product_makefile :=
198 all_product_makefiles :=
199 $(foreach f, $(all_product_configs),200     $(eval _cpm_words := $(subst :,$(space),$(f)))201     $(eval _cpm_word1 := $(word 1,$(_cpm_words)))202     $(eval _cpm_word2 := $(word 2,$(_cpm_words)))203     $(if $(_cpm_word2),204         $(eval all_product_makefiles += $(_cpm_word2))205         $(if $(filter $(TARGET_PRODUCT),$(_cpm_word1)),206             $(eval current_product_makefile += $(_cpm_word2)),),207         $(eval all_product_makefiles += $(f))208         $(if $(filter $(TARGET_PRODUCT),$(basename $(notdir $(f)))),209             $(eval current_product_makefile += $(f)),)))
210 _cpm_words := 211 _cpm_word1 := 212 _cpm_word2 := 213 current_product_makefile := $(strip $(current_product_makefile)) 214 all_product_makefiles := $(strip $(all_product_makefiles))
取xxx.mk所在的路徑notdir後的basename。

3 通過import-product當前的makefile文件,有可能是all,通常是current。這個import過程,基本是解析這個mk文件,並依據_product_var_list來生成一個全新的list變量。

 66 
 67 _product_var_list :=  68     PRODUCT_NAME  69     PRODUCT_MODEL  70     PRODUCT_LOCALES  71     PRODUCT_AAPT_CONFIG  72     PRODUCT_AAPT_PREF_CONFIG  73     PRODUCT_PACKAGES  74     PRODUCT_PACKAGES_DEBUG  75     PRODUCT_PACKAGES_ENG  76     PRODUCT_PACKAGES_TESTS \
這些變量須要在我們Product文件夾下進行定義並賦值,當中相關賦值決定了這個Product是否能通過lunch的Product check。

4. 當對相關的mk文件進行var list的生成後組成全新的變量名:

PRODUCT.device/"vendor"/*/"device_name"/xxx.mk.PRODUCT_NAME = 我們自定義的產品名字.

當中*號可代表存在多級文件夾下的xxx.mk.即/*/會自己主動跨越多級文件夾找到須要的目標文件。

5. resolve-short-product-name

resolve-short-product-name函數定義在build/core/product.mk文件裏。

該函數的本質是依據TARGET_PRODUCT來與我們之前已經依據xxx.mk生成這個var list中的帶PRODUCT_NAME字段的變量值做match匹配。終於假設匹配的話。就把這個變量中屬於這個xxx.mk文件的路徑作為返回值返回。

這個過程假設出現no matches ,則說明盡管我們創建的文件結構盡管正常,但當Product相關的xxx.mk文件裏指定的PRODUCT_NAME與我們lunch申明的值時是不相互匹配的。則說明這個lunch選擇的product的不合理的,須要又一次選擇。或者說這個product name須要改動。。

lunch選擇的TARGET_PRODUCT作用首先是定位xxx,mk文件結構是正常的。如lunch fish。則一般須要定義fish,mk文件。

但終於TARGET_PRODUCT進一步的作用在於須要和詳細fish,mk中的PRODUCT_NAME的值相互match,才會通過match過程。


6. 上述過程終於目的是通過PRODUCT來確定TARGET_DEVICE,從而找到這個device

device最直接的體現是這個xxx,mk中定義的PRODUCT_DEVICE值是須要作為一個文件夾名的,由於興許在envsetup.mk中查找device相關的boardconfig.mk時,須要在device和vendor的文件夾下查找-maxdepath 4 -path */$(TARGET_DEVICE)/BoradConfig,mk(TARGET_DEVICE,值是由xxx,mk中定義的PRODUCT_DEVICE來決定)。


總結:

上述描寫敘述大致能夠說明在定義一個vendor下須要公布的Product時,我們應該先定義一個device_name作為當前Product的一個大文件夾,在這個文件夾下定義一個xxx,mk文件,這個xxx.mk中須要指定PRODUCT_DEVICE和文件夾名一致,然後定義PRODUCT_NAME。再去lunch 中定義同樣的一個name,能夠有user/eng等類型可選。在處理好這些後須要將xxx命名為這個PRODUCT_NAME即TARGET_PRODUCT相應的數值。

之所以須要這樣做的目的是為了順利在all Product makefile文件裏提取和TARGET_Product相一致的mk文件作為當前文件。

/device/gzz/fish/下基本文件:

1.先定義一個xxx.mk。xxx須要由PRODUCT_NAME決定。即兩者一致:

PRODUCT_NAME := my_fish
PRODUCT_DEVICE := fish

device name兩者一致

2.切換文件名稱為my_fish.mk,確保Product name一致

3. AndroidProduct.mk:

PRODUCT_MAKEFILES := $(LOCAL_DIR)/my_fish.mk

4. vendorsetup,sh

add_lunch_combo my_fish-eng,確保Product name一致

5. 其它相關如boardconfig.mk等.


須要說明的是定義的Product和device name兩者是能夠不一致的,後者作為在out/target/product/fish/編譯的輸出。


lunch在處理時從下到上開始處理,TARGET_PRODCUTmy_fish假設無法從全部的Product makefile匹配my_fish.mk文件的話,lunch失敗。

假設my_fish.mk文件被解析並生成var list後。再與my_fish匹配,假設PRODUCT_NAME與my_fish不一致,則match失敗。

match成功並找到device name後確定TAEGET_DEVICE來自於PRODUCT_DEVICE如這裏的fish。假設所在的文件夾名不是fish。則報no device config失敗。

故各方面都須要保持一致。才幹夠通過一次lunch的查找,Android非常好的確保了系統進行編譯時,整個編譯環境是ok的,且是你所須要的Product。











Android集成一個新產品時,lunch的product name和device name註意事項