Android編譯過(guò)程詳解_第1頁(yè)
Android編譯過(guò)程詳解_第2頁(yè)
Android編譯過(guò)程詳解_第3頁(yè)
Android編譯過(guò)程詳解_第4頁(yè)
Android編譯過(guò)程詳解_第5頁(yè)
已閱讀5頁(yè),還剩17頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

##顯示幫助信息#獲取絕對(duì)變量#獲取絕對(duì)變量檢查product#檢查變量#設(shè)置文件路徑#打印配置#設(shè)置環(huán)境變量#設(shè)置序號(hào)#設(shè)置標(biāo)題#設(shè)置type設(shè)置product設(shè)置variant功能同choosecomb#設(shè)置編譯參數(shù)#添加lunch項(xiàng)目#打印lunch列表#配置lunch本文使用Android版本為2?1,采用開發(fā)板為華清遠(yuǎn)見研發(fā)的FS_S5PC100A8開發(fā)板。+ +1.sourcebuild/envsetup.sh這個(gè)命令是用來(lái)將envsetup.sh里的所有用到的命令加載到環(huán)境變量里去,我們來(lái)分析下它。envsetup.sh里的主要命令如下:functionhelp()functionget_abs_build_var()functionget_build_var()functioncheck_product()functioncheck_variant()functionsetpaths()functionprintconfig()functionset_stuff_for_environment()functionset_sequence_number()functionsettitle()functionchoosetype()functionchooseproduct()functionchoosevariant()functiontapas()ofunctionchoosecombo()functionadd_lunch_combo()functionprint_lunch_menu()functionlunch()makefromtop查找makefilemakefromtop查找makefilemakefromcurrentmakethesupplied#回到根目錄#查找java文件#查找c/cpp文件#跳到指定目錄generic-engfunctionm()functionfindmakefile()functionmm()directoryfunctionmmm()directoriesfunctioncroot()functioncproj()functionpid()functionsystemstack()functiongdbclient()functionjgrep()functioncgrep()functionresgrep()functiontracedmdump()functionrunhat()functiongetbugreports()functionstartviewserver()functionstopviewserver()functionisviewserverstarted()functionsmoketest()functionruntest()functiongodir()#這是系統(tǒng)自動(dòng)增加了一個(gè)默認(rèn)的編譯項(xiàng)#addthedefaultonehereadd_lunch_combogeneric-eng#下面的代碼很重要,它要從vendor目錄下查找vendorsetup.sh文件,如果查到了,就加載它#Executethecontentsofanyvendorsetup.shfileswecanfind.forfin/bin/lsvendor/*/vendorsetup.shvendor/*/build/vendorsetup.sh2>/dev/null'doecho""including$f〃.$fdone根據(jù)上面的內(nèi)容,可以推測(cè)出,如果要想定義自己的產(chǎn)品編譯項(xiàng),簡(jiǎn)單的辦法是直接在envsetup.sh最后,添加上add_lunch_combomyProduct-eng,當(dāng)然這么做,不太符合上面代碼最后的本意,我們還是老實(shí)的在vendor目錄下創(chuàng)建自己公司名字,然后在公司目錄下創(chuàng)建一個(gè)新的vendorsetup.sh,在里面添加上自己的產(chǎn)品編譯項(xiàng)#mkdirvendor/farsight/#touchvendor/farsight/vendorsetup.sh#echo〃add_lunch_combofslOO—eng"">vendor/farsight/vendorsetup.sh這樣,當(dāng)我們?cè)趫?zhí)行sourcebuild/envsetup.sh命令的時(shí)候,可以在shell上看到下面的信息:includingvendor/farsight/vendorsetup.sh2.按照android官網(wǎng)的步驟,開始執(zhí)行l(wèi)unchfull-eng當(dāng)然如果你按上述命令執(zhí)行,它編譯的還是通用的eng版本系統(tǒng),不是我們個(gè)性系統(tǒng),我們可以執(zhí)行l(wèi)unch命令,它會(huì)打印出一個(gè)選擇菜單,列出可用的編譯選項(xiàng)如果你按照第一步中添加了vendorsetup.sh那么,你的選項(xiàng)中會(huì)出現(xiàn):You'rebuildingonLinuxgeneric—engSimulatorfslOO—engLunchmenu...pickacombo:generic—engSimulatorfslOO-eng其中第3項(xiàng)是我們自己添加的編譯項(xiàng)。lunch命令是envsetup.sh里定義的一個(gè)命令,用來(lái)讓用戶選擇編譯項(xiàng),來(lái)定義Product和編譯過(guò)程中用到的全局變量。我們一直沒(méi)有說(shuō)明前面的fs100-eng是什么意思,現(xiàn)在來(lái)說(shuō)明下,fslOO是我定義的產(chǎn)品的名字,eng是產(chǎn)品的編譯類型,除了eng外,還有user,userdebug,分別表示:eng:工程機(jī),user:最終用戶機(jī)userdebug:調(diào)試測(cè)試機(jī)由此可見,除了eng和user外,另外兩個(gè)一般不能交給最終用戶的,記得m8出來(lái)的時(shí)候先放出了一部分eng工程機(jī),然后出來(lái)了user機(jī)之后,可以用工程機(jī)換。好了,我們來(lái)分析下lunch命令干了什么?functionlunch(){localanswerif["$1"];thenlunch后面直接帶參數(shù)answer二$1elselunch后面不帶參數(shù),則打印處所有的targetproduct和variant菜單提供用戶選擇print_lunch_menuecho-n"Whichwouldyoulike?[generic-eng]"readanswerfilocalselection二if[-z"$answer"]then#如果用戶在菜單中沒(méi)有選擇,直接回車,則為系統(tǒng)缺省的generic-engselection二generic—engelif["$answer"="simulator"]then#如果是模擬器selection二Simulatorelif(echo-n$answer|grep-q-e""[0-9][0-9]*$")then#如果answer是選擇菜單的數(shù)字,則獲取該數(shù)字對(duì)應(yīng)的字符串if[$answer-le${#LUNCH_MENU_CHOICES[@]}]thenselection=${LUNCH_MENU_CHOICES[$(($answer-$_arrayoffset))]}fi#如果answer字符串匹配*-*模式(*的開頭不能為-)elif(echo-n$answer|grep-q-e"T\-]「\-]*-「\-]「\-]*$")thenselection=$answerfiif[-z"$selection"]thenechoecho"Invalidlunchcombo:$answer"return1fi#specialcasethesimulatorif["$selection"二"simulator"]then#模擬器模式exportTARGET_PRODUCT二simexportTARGET_BUILD_VARIANT二engexportTARGET_SIMULATOR=trueexportTARGET_BUILD_TYPE二debugelse#將product-variant模式種的product分離出來(lái)localproduct=$(echo-n$selection|sed-e"s/-.*$//")#檢查之,調(diào)用關(guān)系check_product()->get_build_var()->build/core/config.mk比較羅嗦,不展開了check_product$productif[$?-ne0]thenechoecho“**Don'thaveaproductspecfor:'$product'"echo“**Doyouhavetherightrepomanifest?"product二fi#將product-variant模式種的variant分離出來(lái)localvariant=$(echo-n$selection|sed-e"s/T\-]*-//")#檢查之,看看是否在(useruserdebugeng)范圍內(nèi)check_variant$variantif[$?-ne0]thenechoecho“**Invalidvariant:'$variant'"echo〃**Mustbeoneof${VARIANT_CHOICES[@]}〃variant二fiif[-z〃$product""-o-z〃$variant""]thenechoreturn1fi#導(dǎo)出環(huán)境變量,這兒很重要,因?yàn)楹竺娴木幾g系統(tǒng)都是依賴于這里定義的幾個(gè)變量的exportTARGET_PRODUCT=$productexportTARGET_BUILD_VARIANT=$variantexportTARGET_SIMULATOR二falseexportTARGET_BUILD_TYPE二releasefi#!simulatorecho#設(shè)置到環(huán)境變量,比較多,不再一一列出,最簡(jiǎn)單的方法set>env.txt可獲得set_stuff_for_environment#打印一些主要的變量,調(diào)用關(guān)系printconfig()->get_build_var()->build/core/config.mk->build/core/envsetup.mk比較羅嗦,不展開了printconfig}由上面分析可知,lunch命令可以帶參數(shù)和不帶參數(shù),最終導(dǎo)出一些重要的環(huán)境變量,從而影響編譯系統(tǒng)的編譯結(jié)果。導(dǎo)出的變量如下(以實(shí)際運(yùn)行情況為例)TARGET_PRODUCT二fslOOTARGET_BUILD_VARIANT二engTARGET_SIMULATOR二falseTARGET_BUILD_TYPE二release執(zhí)行完上述兩個(gè)步驟,就該執(zhí)行:make命令了,下篇來(lái)分析。通過(guò)上篇文章,我們分析了編譯android時(shí)sourcebuild/envsetup.sh和lunch命令,在執(zhí)行完上述兩個(gè)命令后,我們就可以進(jìn)行編譯android了。1.make執(zhí)行make命令的結(jié)果就是去執(zhí)行當(dāng)前目錄下的Makefile文件,我們來(lái)看下它的內(nèi)容:?###DONOTEDITTHISFILE###includebuild/core/main.mk###DONOTEDITTHISFILE###呵呵,看到上面的內(nèi)容,我們都會(huì)笑,這是我見過(guò)最簡(jiǎn)單的Makefile了,我們?cè)倏聪耣uild/core/main.mk在main.mk里,定義了變量TOPDIR,TOP為當(dāng)前目錄,BUILD_SYSTEM為build/core目錄。在49行,包含了build/core/config.mk文件。后面的代碼是check環(huán)境變量,所有的Makefile都通過(guò)build/core/main.mk這個(gè)文件組織在一起,它定義了一個(gè)默認(rèn)goals:droid,當(dāng)我們?cè)赥OP目錄下,敲Make實(shí)際上就等同于我們執(zhí)行makedroid。當(dāng)Makeinclude所有的文件,完成對(duì)所有make我文件的解析以后就會(huì)尋找生成droid的規(guī)則,依次生成它的依賴,直到所有滿足的模塊被編譯好,然后使用相應(yīng)的工具打包成相應(yīng)的img。這兒不是我們的重點(diǎn),不再多說(shuō)。該文件被main.mk包含。定義了以下環(huán)境變量:SRC_HEADERS:二\$(TOPDIR)system/core/include\$(TOPDIR)hardware/libhardware/include \$(TOPDIR)hardware/libhardware_legacy/include\$(TOPDIR)hardware/ril/include\$(TOPDIR)dalvik/libnativehelper/include\$(TOPDIR)frameworks/base/include\$(TOPDIR)frameworks/base/opengl/include \$(T0PDIR)external/skia/includeSRC_HOST_HEADERS:=$(TOPDIR)tools/includeSRC_LIBRARIES:=$(TOPDIR)libsSRC_SERVERS:=$(TOPDIR)serversSRC_TARGET_DIR:=$(TOPDIR)build/targetSRC_API_DIR:=$(TOPDIR)frameworks/base/api 然后定義了下面幾個(gè)重要的編譯命令43CLEAR_VARS:=$(BUILD_SYSTEM)/clear_vars.mkBUILD_HOST_STATIC_LIBRARY:=$(BUILD_SYSTEM)/host_static_library.mkBUILD_HOST_SHARED_LIBRARY:=$(BUILD_SYSTEM)/host_shared_library.mkBUILD_STATIC_LIBRARY:=$(BUILD_SYSTEM)/static_library.mkBUILD_RAW_STATIC_LIBRARY:二$(BUILD_SYSTEM)/raw_static_library.mkBUILD_SHARED_LIBRARY:=$(BUILD_SYSTEM)/shared_library.mkBUILD_EXECUTABLE:=$(BUILD_SYSTEM)/executable.mkBUILD_RAW_EXECUTABLE:=$(BUILD_SYSTEM)/raw_executable.mkBUILD_HOST_EXECUTABLE:=$(BUILD_SYSTEM)/host_executable.mkBUILD_PACKAGE:=$(BUILD_SYSTEM)/package.mkBUILD_HOST_PREBUILT:=$(BUILD_SYSTEM)/host_prebuilt.mkBUILD_PREBUILT:=$(BUILD_SYSTEM)/prebuilt.mkBUILD_MULTI_PREBUILT:=$(BUILD_SYSTEM)/multi_prebuilt.mkBUILD_JAVA_LIBRARY:=$(BUILD_SYSTEM)/java_library.mkBUILD_STATIC_JAVA_LIBRARY:=$(BUILD_SYSTEM)/static_java_library.mkBUILD_HOST_JAVA_LIBRARY:二$(BUILD_SYSTEM)/host_java_library.mkBUILD_DROIDDOC:=$(BUILD_SYSTEM)/droiddoc.mkBUILD_COPY_HEADERS:=$(BUILD_SYSTEM)/copy_headers.mkBUILD_KEY_CHAR_MAP:=$(BUILD_SYSTEM)/key_char_map.mk上述命令變量其實(shí)是對(duì)應(yīng)的mk文件名,所有的Android.mk文件里基本上都包含上述命令變量,如:CLEAR_VARS:用來(lái)清除之前定義的環(huán)境變量BUILD_SHARED_LIBRARY:用來(lái)指定編譯動(dòng)態(tài)庫(kù)過(guò)程# #Definemostoftheglobalvariables.Thesearetheonesthat#arespecifictotheuser'sbuildconfiguration.include$(BUILD_SYSTEM)/envsetup.mk113#Boardsmaybedefinedunder$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)#orundervendor/*/$(TARGET_DEVICE).Searchinbothplaces,but#makesureonlyoneexists.#RealboardsshouldalwaysbeassociatedwithanOEMvendor.board_config_mk:二\$(strip$(wildcard\$(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk\vendor/*/$(TARGET_DEVICE)/BoardConfig.mk\))ifeq($(board_config_mk),)$(errorNoconfigfilefoundforTARGET_DEVICE$(TARGET_DEVICE))endififneq($(words$(board_config_mk)),1)$(errorMultipleboardconfigfilesforTARGET_DEVICE$(TARGET_DEVICE):$(board_config_mk))endifinclude$(board_config_mk)TARGET_DEVICE_DIR:=$(patsubst%/,%,$(dir$(board_config_mk)))board_config_mk:=112行又包含了另外一個(gè)重要的mk文件envsetup.mk,我們來(lái)看一下。envsetup.mk

25ifeq($(TARGETPRODUCT),) 判斷TARGETPRODUCT是否為空,26ifeq($(TARGETSIMULATOR),true)27TARGETPRODUCT:=sim28else29TARGETPRODUCT:=generic30endif31endif第25行,判斷TARGET_PRODUCT是否為空,根據(jù)上一節(jié)分析可知,TARGET_PRODUCT=fs10034#thevariant一一thesetoffilesthatareincludeforabuild35ifeq($(strip$(TARGETBUILDVARIANT)),)36TARGETBUILDVARIANT:=eng37endif3839#ReadtheproductspecssoweangetTARGETDEVICEandother40#variablesthatweneedinordertolocatetheoutputfiles.41include$(BUILDSYSTEM)/productconfig.mk在41行又包含了product_config.mk文件,等會(huì)我們?cè)俜治鏊瓤聪旅娴?48# 149#figureouttheoutputdirectories150151ifeq(,$(strip$(OUT_DIR)))152OUTDIR:=$(TOPDIR)out

153154155156157158159160161162184187188189190191200201202203204205206207208209210211212213214215216217218219220221222endifDEBUG_OUT_DIR:=$(OUT_DIR)幻ebugMovethehostortargetunderthedebugdirectoryifnecessary.TARGET_OUT_ROOT_release:=$(OUT_DIR)gargetTARGET_OUT_ROOT_debug:=$(DEBUG_OUT_DIR)比argetTARGET_OUT_ROOT:=$(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))PRODUCT_OUT:=$(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)HOST_OUT_EXECUTABLES:=$(HOST_OUT)/binHOST_OUT_SHARED_LIBRARIES:=$(HOST_OUT)/libHOST_OUT_JAVA_LIBRARIES:=$(HOST_OUT)/frameworkHOST_OUT_SDK_ADDON:=$(HOST_OUT)怡dk_addonTARGET_OUT_INTERMEDIATES:=$(PRODUCT_OUT)^bjTARGET_OUT_HEADERS:=$(TARGET_OUT_INTERMEDIATES)/includeTARGET_OUT_INTERMEDIATE_LIBRARIES:=$(TARGET_OUT_INTERMEDIATES)AibTARGET_OUT_COMMON_INTERMEDIATES:=$(TARGET_COMMON_OUT_ROOT)〃bjTARGET_OUT:=$(PRODUCT_OUT)SystemTARGET_OUT_EXECUTABLES:=$(TARGET_OUT)/binTARGET_OUT_OPTIONAL_EXECUTABLES:=$(TARGET_OUT)/xbinTARGET_OUT_SHARED_LIBRARIES:=$(TARGET_OUT)/libTARGET_OUT_JAVA_LIBRARIES:=$(TARGET_OUT)/frameworkTARGET_OUT_APPS:=$(TARGET_OUT)/appTARGET_OUT_KEYLAYOUT:=$(TARGET_OUT)/usr辰y(tǒng)layoutTARGET_OUT_KEYCHARS:=$(TARGET_OUT)/usr%eycharsTARGET_OUT_ETC:=$(TARGET_OUT)/fetcTARGET_OUT_STATIC_LIBRARIES:=$(TARGET_OUT_INTERMEDIATES)/libTARGET_OUT_NOTICE_FILES:=$(TARGET_OUT_INTERMEDIATES)/NOTICE_FILESTARGET_OUT_DATA:=$(PRODUCT_OUT)幻ataTARGET_OUT_DATA_EXECUTABLES:=$(TARGET_OUT_EXECUTABLES)TARGET_OUT_DATA_SHARED_LIBRARIES:=$(TARGET_OUT_SHARED_LIBRARIES)TARGET_OUT_DATA_JAVA_LIBRARIES:=$(TARGET_OUT_JAVA_LIBRARIES)TARGET_OUT_DATA_APPS:=$(TARGET_OUT_DATA)/appTARGET_OUT_DATA_KEYLAYOUT:=$(TARGET_OUT_KEYLAYOUT)

TARGET_OUT_DATA_KEYCHARS:=$(TARGET_OUT_KEYCHARS)TARGET_OUT_DATA_ETC:=$(TARGET_OUT_ETC)TARGET_OUT_DATA_STATIC_LIBRARIES:=$(TARGET_OUT_STATIC_LIBRARIES)226TARGET_OUT_UNSTRIPPED:=$(PRODUCT_OUT)SymbolsTARGET_OUT_EXECUTABLES_UNSTRIPPED:=$(TARGET_OUT_UNSTRIPPED)/system^inTARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED:=$(TARGET_OUT_UNSTRIPPED)/system/libTARGET_ROOT_OUT_UNSTRIPPED:=$(TARGET_OUT_UNSTRIPPED)TARGET_ROOT_OUT_SBIN_UNSTRIPPED:=$(TARGET_OUT_UNSTRIPPED)怡binTARGET_ROOT_OUT_BIN_UNSTRIPPED:=$(TARGET_OUT_UNSTRIPPED)力in233TARGET_ROOT_OUT:=$(PRODUCT_OUT)£ootTARGET_ROOT_OUT_BIN:=$(TARGET_ROOT_OUT)力inTARGET_ROOT_OUT_SBIN:=$(TARGET_ROOT_OUT)怡binTARGET_ROOT_OUT_ETC:=$(TARGET_ROOT_OUT)滄tcTARGET_ROOT_OUT_USR:=$(TARGET_ROOT_OUT加sr239TARGET_RECOVERY_OUT:=$(PRODUCT_OUT)RecoveryTARGET_RECOVERY_ROOT_OUT:=$(TARGET_RECOVERY_OUT)£oot242TARGET_SYSLOADER_OUT:=$(PRODUCT_OUT)怡ysloaderTARGET_SYSLOADER_ROOT_OUT:=$(TARGET_SYSLOADER_OUT)£ootTARGET_SYSLOADER_SYSTEM_OUT:=$(TARGET_SYSLOADER_OUT)/rootSystem246TARGET_INSTALLER_OUT:=$(PRODUCT_OUT)AnstallerTARGET_INSTALLER_DATA_OUT:=$(TARGET_INSTALLER_OUT)幻ataTARGET_INSTALLER_ROOT_OUT:=$(TARGET_INSTALLER_OUT)£ootTARGET_INSTALLER_SYSTEM_OUT:=$(TARGET_INSTALLER_OUT)/root/system面的代碼是指定了目標(biāo)輸出代碼的位置和主機(jī)輸出代碼的位置,重要的幾個(gè)如下:PRODUCT_OUT=這個(gè)的結(jié)果要根據(jù)product_config.mk文件內(nèi)容來(lái)決定,其實(shí)是out/target/product/fs100/TARGET_OUT=$(PRODUCT_OUT)/system

TARGET_OUT_EXECUTABLES=$(PRODUCT_OUT)/system/binTARGET_OUT_SHARED_LIBRARIES=$(PRODUCT_OUT)/system/libTARGET_OUT_JAVA_LIBRARIES=$(PRODUCT_OUT)/system/frameworkTARGET_OUT_APPS=$(PRODUCT_OUT)/system/appTARGET_OUT_ETC=$(PRODUCT_OUT)/system/etcTARGET_OUT_STATIC_LIBRARIES=$(PRODUCT_OUT)/obj/libTARGET_OUT_DATA=$(PRODUCT_OUT)/dataTARGET_OUT_DATA_APPS=$(PRODUCT_OUT)/data/appTARGET_ROOT_OUT=$(PRODUCT_OUT)/rootTARGET_ROOT_OUT_BIN=$(PRODUCT_OUT)/binTARGET_ROOT_OUT_SBIN=$(PRODUCT_OUT)/system/sbinTARGET_ROOT_OUT_ETC=$(PRODUCT_OUT)/system/etcTARGET_ROOT_OUT_USR=$(PRODUCT_OUT)/system/usr總結(jié)下:envsetup.mk文件主要包含了product_config.mk文件,然后指定了編譯時(shí)要輸出的所有文件的OUT目錄。build/core/product_config.mk157include$(BUILD_SYSTEM)/product.mk#ReadinalloftheproductdefinitionsspecifiedbytheAndroidProducts?mk#filesinthetree.##TODO:whenwestartallowingdirectpointerstoproductfiles,#guaranteethatthe'reinthislist.$(callimport-products,$(get-all-productmakefiles))$(check-all-products)0#Convertashortnamelike"sooner"intothepathtotheproduct#filedefiningthatproduct.#

INTERNAL_PRODUCT:=$(callresolvewhort-product-name,$(TARGET_PRODUCT))#Findthedevicethatthisproductmapsto.TARGET_DEVICE:=$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)157行,我靠,又包含了product.mk文件165行,調(diào)用函數(shù)import-products,$(get-all-product-makefiles),這兒我們看上面的注釋:ReadinalloftheproductdefinitionsspecifiedbytheAndroidProducts.mkfilesinthetree.TODO:whenwestartallowingdirectpointerstoproductfiles,guaranteethatthey'reinthislist?意思是說(shuō):讀取指定的目錄下所有的AndrodProducts.mk文件中定義的產(chǎn)品信息其實(shí)get-all-product-makefiles返回所有的產(chǎn)品文件xxx.mkimport-products函數(shù)去驗(yàn)證這些產(chǎn)品配置文件是否都包含有必須的配置信息,細(xì)節(jié)后面分析。173行調(diào)用了resolve-short-product-name函數(shù),它將返回TARGET_PRODUCT產(chǎn)品的配置文件目錄,并賦給INTERNAL_PRODUCT也就是說(shuō):

INTERNAL_PRODUCT=vendor/farsight/productsfsIOO.mkTARGET_DEVICE=fs100如果調(diào)試看其結(jié)果,可以在167行,將#$(dump-product)取消注釋然后在175行添加:$(info$(INTERNAL_PRODUCT))在178行添加:$(info$(TARGET_DEVICE)),查看調(diào)試結(jié)果。總結(jié)一下:product_config.mk主要讀取vendor目錄下不同廠商自己定義的AndrodProducts.mk文件,從該文件里取得所有產(chǎn)品的配置文件,然后再根據(jù)lunch選擇的編譯項(xiàng)TARGET_PRODUCT,找到與之對(duì)應(yīng)的配置文件,然后設(shè)置TARGET_DEVICE變量,用于后續(xù)編譯。5.build/core/product.mk17##FunctionsforincludingAndroidProducts.mkfiles#20##ReturnsthelistofallAndroidProducts.mkfiles.#$(call)is'tnecessary.#define_find-android-products-files$(shelltest-dvendor&&findvendor-maxdepth6-nameAndroidProducts.mk)\$(SRC_TARGET_DIR)/product/AndroidProducts.mkendef

TOC\o"1-5"\h\z##ReturnsthesortedconcatenationofallPRODUCT_MAKEFILES#variablessetinallAndroidProducts.mkfiles.#$(call)is'tnecessary.#defineget-all-product-makefiles$(sort\$(foreachf,$(_find-android-productsfiles),\$(evalPRODUCT_MAKEFILES :)\$(evalLOCAL_DIR:=$(patsubst%/,%,備(ir$(f))))\$(evalinclude$(f))\$(PRODUCT_MAKEFILES)\)\$(evalPRODUCT_MAKEFILES:)\$(evalLOCAL_DIR:)\)endef通過(guò)注釋可知,本文件中主要是一些用來(lái)處理AndroidProduct.mk的函數(shù)_find-android-products-files:用來(lái)獲得vendor目錄下,所有名字為AndroidProduct.mk的文件列表。get-all-product-makefiles:用來(lái)獲得所有AndroidProduct.mk文件里定義的PRODUCT_MAKEFILES的值(其實(shí)是產(chǎn)品文件路徑名)。在vendor目錄下,每個(gè)公司目錄下都會(huì)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論