解析MTK手機(jī)軟件系統(tǒng)構(gòu)建過(guò)程
MTK手機(jī)軟件系統(tǒng)構(gòu)建過(guò)程是本文要介紹的內(nèi)容,主要是來(lái)了解并學(xué)習(xí)MTK手機(jī)軟件系統(tǒng)應(yīng)用,首先來(lái)搭建一個(gè)MTK手機(jī)應(yīng)用系統(tǒng)平臺(tái),具體內(nèi)容來(lái)看本文詳解。
MTK手機(jī)軟件系統(tǒng)的構(gòu)建使用了GNU的make,使得整個(gè)工程的構(gòu)建可以自動(dòng)進(jìn)行,且可以靈活控制。整個(gè)構(gòu)建過(guò)程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、

在MTK手機(jī)軟件系統(tǒng)的根目錄下有一個(gè)批處理文件Make.bat,這個(gè)批處理文件啟動(dòng)了整個(gè)工程的構(gòu)建過(guò)程。在windows的命令行下,在該系統(tǒng)的根目錄下輸入命令make和相應(yīng)的參數(shù)即可開(kāi)始工程的構(gòu)建,該批處理文件的使用方法如下所示。
- Usage:
- make["customer"|"mt62xx"]"project""action"["modules"]
- Description:
- customer=mtk(Defaultcustomer)
- =firefly17_demo(FIREFLY17_DEMOproject)
- =[mt6217|mt6219|mt6226|mt6227|mt6228|mt6229](EVBonly)
- =...
- project=l1s(Layer1stand-alone)
- =gsm(GSMonly)
- =gprs(GPRSonly)
- =basic(BasicFramework)
- action=new(codegen,resgen,clean,update)(default)
- =updateoru(scan,compile,link)
- =remakeorr(compile,link)
- =cleanorc(clean)
- =resgen(resgen)
- =c,u(cleanthenupdate)
- =c,r(cleanthenremake)
- =codegen(codegen)
- =viewlog(openedittoviewbuildlog)
- =emigen(emigen)
- =emiclean(emiclean)
- module(s)=modules'name(kal,l1,...)
- =>OPTIONALwhenactionisoneof(cleancremakerupdateuc,rc,u)
Example:
- makegsmnew(MT6205BEVBnew)
- makegprscodegen(MT6218BEVBcodegen)
- makemt6219gprsupdate(MT6219EVBupdate)
- makefirefly17_demogprsnew
- makemilan_demogprsc,uinitcustom
- makemt6219gprsrinitcustomdrv
其中較常用的action有new、update、remake、new_modis這幾個(gè)。
new是全新開(kāi)始構(gòu)建整個(gè)工程的ARM版,包括圖片、聲音、字符串等資源都要重做,依賴的其他動(dòng)作最多,是最徹底也是耗時(shí)最長(zhǎng)的一個(gè)動(dòng)作,一般得到一個(gè)新的MTK發(fā)布版本后要做一次。
update是重新更新整個(gè)工程的ARM版,該動(dòng)作會(huì)掃描工程中文件和庫(kù)的依賴關(guān)系,若依賴關(guān)系有變化會(huì)建立新的依賴關(guān)系,隨后根據(jù)新的依賴關(guān)系重新編譯鏈接有改動(dòng)的部分,一般在增加或刪除一些驅(qū)動(dòng)或應(yīng)用的情況下需要用update。
remake是重新編譯整個(gè)工程的ARM版,該動(dòng)作只是簡(jiǎn)單的重新編譯鏈接有改動(dòng)的部分,不檢查依賴關(guān)系,是耗時(shí)最短的一個(gè)動(dòng)作,也是最常用的動(dòng)作。
new_modis是全新構(gòu)建整個(gè)工程的PC模擬版,其調(diào)用VC的編譯器和鏈接器得到一個(gè)可以在windows上運(yùn)行的PC模擬版。MMI應(yīng)用軟件工程師可以在沒(méi)有硬件板的情況下在PC上檢查和調(diào)試自己寫(xiě)好的應(yīng)用。
Make.bat實(shí)際上只起引導(dǎo)作用,其只有一行批處理語(yǔ)句perlmake2.pl%*,于是運(yùn)行該批處理文件后控制權(quán)轉(zhuǎn)給了perl腳本make2.pl。在這個(gè)perl腳本中解析了用戶輸入的命令行參數(shù),設(shè)置變量,準(zhǔn)備make時(shí)需要的臨時(shí)配置文件,隨后根據(jù)生成的可運(yùn)行映像是PC模擬版還是ARM版而分別調(diào)用不同的構(gòu)建過(guò)程。
Pc模擬版的構(gòu)建通過(guò)調(diào)用如下命令實(shí)現(xiàn)。
- system("$msdevMoDIS.dsw/MAKE\"$argu-Win32$modisDir\"
- /OUT${MoDISLogDir}\\${argu}.log")
在這里$msdev就是VC的msdev,通過(guò)VC的工程文件MoDIS.dsw和后面的參數(shù)進(jìn)行具體的構(gòu)建過(guò)程。熟悉VC工程的朋友應(yīng)該比較清楚,因此就不再具體解釋了。之后將只以ARM版為主來(lái)講解整個(gè)工程的構(gòu)建過(guò)程。
ARM版的構(gòu)建通過(guò)調(diào)用如下命令實(shí)現(xiàn)。
- system("${makeCmd}-f${makeFolder}${myMF}-r-R
- CUSTOMER=$customPROJECT=$project$action")
在這里${makeCmd}是tools\make.exe,即GNU的make,${makeFolder}${myMF}是make\Gsm2.mak,$action是new、update、remake等。變量CUSTOMER和PROJECT分別是客戶名和項(xiàng)目名,在構(gòu)建過(guò)程中將根據(jù)此兩個(gè)變量的值選定項(xiàng)目相關(guān)的配置文件,從而實(shí)現(xiàn)客戶化的定制。通過(guò)給make指定ARM版的核心Makefile文件Gsm2.mak,開(kāi)始了ARM版的構(gòu)建過(guò)程。
Gsm2.mak文件中包含了Option.mak這個(gè)配置用的Makefile文件,另外還包含了一些以.tmp和.bld為后綴的由perl腳本make2.pl生成的臨時(shí)配置文件。這些臨時(shí)配置文件主要是一些action如clean、remake等所需的變量設(shè)置,及客戶化和版本號(hào)等的一些信息。Gsm2.mak控制了new、update、remake等動(dòng)作的過(guò)程。具體分別如下所示。
- new:cleanallcmmgenmmi_feature_checkasngencodegenasnregen\
- operator_check_liteupdate
- update:cleanlogcleanbinmcddll_updatecodegenresgencksysdrvremake
- remake:cleanlogcleanbingenvernolibs$(BIN_FILE)done
上面的構(gòu)建過(guò)程的幾個(gè)步驟中,最重要的兩個(gè)步驟是libs、$(BIN_FILE)。libs調(diào)用ARM版的編譯器和連接器將各個(gè)模塊目錄下的C文件編譯鏈接為獨(dú)立的庫(kù)。$(BIN_FILE)這個(gè)步驟將各個(gè)模塊編譯鏈接得到的庫(kù)和mtk_lib目錄下的庫(kù)一起鏈接起來(lái)得到一個(gè)映像文件,然后使用ADS的工具fromelf將映像文件生成以變量BIN_FILE命名的二進(jìn)制文件,該文件可以下載到硬件板上運(yùn)行。
libs這個(gè)步驟如下所示。
- libs:cleanlibstartbuildlibs$(COMPLIBLIST)
libs中真正進(jìn)行編譯鏈接的步驟是$(COMPLIBLIST),要生成的庫(kù)由變量COMPLIBLIST列出,在ARM版中,變量COMPLIBLIST從變量COMPLIST得到。變量COMPLIST是在Option.mak及其包含的Makefile文件中賦值的。因有很多庫(kù)需要編譯鏈接,變量COMPLIBLIST展開(kāi)后包含多個(gè)步驟,而這些步驟都是重復(fù)不變的,因此在定義步驟$(COMPLIBLIST)的構(gòu)建過(guò)程時(shí)使用%.lib代替。%.lib這個(gè)步驟先清除了之前的一些依賴關(guān)系文件,將一些變量的設(shè)置寫(xiě)入~compbld.tmp這個(gè)臨時(shí)文件中,然后給make指定Makefile文件comp.mak,完成庫(kù)的編譯和鏈接,如下所示。
- %.lib:
- …
- @if/I%OS%EQUWINDOWS_NT\
- (if/I$(BM_NEW)EQUTRUE\
- (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)
- \
- else\
- (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)\
- )\
- else\
- (if/I$(BM_NEW)EQUTRUE\
- (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\
- else\
- (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\
- )
上面的命令語(yǔ)句中,參數(shù)-k是指有錯(cuò)誤也要繼續(xù)編譯,-r和-R是指沒(méi)有GNUmake的默認(rèn)規(guī)則和變量。COMPONENT=$*把當(dāng)前要生成的庫(kù)賦給變量COMPONENT。要注意%.lib匹配了所有要生成的庫(kù),但這個(gè)步驟一次只生成一個(gè)模塊的庫(kù),這個(gè)步驟對(duì)所有匹配到的庫(kù)都會(huì)執(zhí)行一次。
comp.mak這個(gè)Makefile文件控制了模塊的編譯鏈接過(guò)程。在這個(gè)文件中,首先將當(dāng)前模塊要生成的庫(kù)(由變量COMPONENT傳入)設(shè)置給了變量TARGLIB。之后從
庫(kù)的編譯鏈接由update_lib步驟完成,這個(gè)步驟直接依賴了$(TARGLIB)。目標(biāo)$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj:%.cpp等規(guī)則編譯得到的中間目標(biāo)文件鏈接得到的。其主要過(guò)程如下所示。
- $(TARGLIB):
- ...
- @ifexist$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib\
- (copy/z$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib$(subst/,\,$(TARGLIB)))&\
- ($(LIB)-r$(TARGLIB)$(COMPOBJS_DIR)/*.obj)\
- else\
- ($(LIB)-create$(TARGLIB)$(COMPOBJS_DIR)/*.obj)
- ...
Option.mak是整個(gè)工程構(gòu)建過(guò)程中的總控配置文件,在這個(gè)文件中還包含了
小結(jié):解析MTK手機(jī)軟件系統(tǒng)構(gòu)建過(guò)程的內(nèi)容介紹完了,希望通過(guò)學(xué)習(xí)MTK手機(jī)軟件系統(tǒng)的構(gòu)建能對(duì)你有所幫助。