解析MTK手机软件系统构建过程

移动开发
MTK手机软件系统构建过程是本文要介绍的内容,主要是来了解并学习MTK手机软件系统应用,首先来搭建一个MTK手机应用系统平台,具体内容来看本文详解。

MTK手机软件系统构建过程是本文要介绍的内容,主要是来了解并学习MTK手机软件系统应用,首先来搭建一个MTK手机应用系统平台,具体内容来看本文详解。

MTK手机软件系统的构建使用了GNU的make,使得整个工程的构建可以自动进行,且可以灵活控制。整个构建过程由Make.bat、make2.pl、MoDIS.dsw、Gsm2.mak、Option.mak、_ .mak等文件控制。构建PC模拟版是通过msdev和VC的工程文件MoDIS.dsw来完成的。Gsm2.mak是构建ARM版的核心Makefile文件,整个构建过程由其控制,其他是一些启动、选项配置、子过程的文件。其关系图如下所示。

MTK手机软件系统的根目录下有一个批处理文件Make.bat,这个批处理文件启动了整个工程的构建过程。在windows的命令行下,在该系统的根目录下输入命令make和相应的参数即可开始工程的构建,该批处理文件的使用方法如下所示。

  1. Usage:  
  2. make["customer"|"mt62xx"]"project""action"["modules"]  
  3. Description:  
  4. customer=mtk(Defaultcustomer)  
  5. =firefly17_demo(FIREFLY17_DEMOproject)  
  6. =[mt6217|mt6219|mt6226|mt6227|mt6228|mt6229](EVBonly)  
  7. =...  
  8. project=l1s(Layer1stand-alone)  
  9. =gsm(GSMonly)  
  10. =gprs(GPRSonly)  
  11. =basic(BasicFramework)  
  12. action=new(codegen,resgen,clean,update)(default)  
  13. =updateoru(scan,compile,link)  
  14. =remakeorr(compile,link)  
  15. =cleanorc(clean)  
  16. =resgen(resgen)  
  17. =c,u(cleanthenupdate)  
  18. =c,r(cleanthenremake)  
  19. =codegen(codegen)  
  20. =viewlog(openedittoviewbuildlog)  
  21. =emigen(emigen)  
  22. =emiclean(emiclean)  
  23. module(s)=modules'name(kal,l1,...)  
  24. =>OPTIONALwhenactionisoneof(cleancremakerupdateuc,rc,u) 

Example:

  1. makegsmnew(MT6205BEVBnew)  
  2. makegprscodegen(MT6218BEVBcodegen)  
  3. makemt6219gprsupdate(MT6219EVBupdate)  
  4. makefirefly17_demogprsnew  
  5. makemilan_demogprsc,uinitcustom  
  6. makemt6219gprsrinitcustomdrv 

其中较常用的action有new、update、remake、new_modis这几个。

new是全新开始构建整个工程的ARM版,包括图片、声音、字符串等资源都要重做,依赖的其他动作最多,是最彻底也是耗时最长的一个动作,一般得到一个新的MTK发布版本后要做一次。

update是重新更新整个工程的ARM版,该动作会扫描工程中文件和库的依赖关系,若依赖关系有变化会建立新的依赖关系,随后根据新的依赖关系重新编译链接有改动的部分,一般在增加或删除一些驱动或应用的情况下需要用update。

remake是重新编译整个工程的ARM版,该动作只是简单的重新编译链接有改动的部分,不检查依赖关系,是耗时最短的一个动作,也是最常用的动作。

new_modis是全新构建整个工程的PC模拟版,其调用VC的编译器和链接器得到一个可以在windows上运行的PC模拟版。MMI应用软件工程师可以在没有硬件板的情况下在PC上检查和调试自己写好的应用。

Make.bat实际上只起引导作用,其只有一行批处理语句perlmake2.pl%*,于是运行该批处理文件后控制权转给了perl脚本make2.pl。在这个perl脚本中解析了用户输入的命令行参数,设置变量,准备make时需要的临时配置文件,随后根据生成的可运行映像是PC模拟版还是ARM版而分别调用不同的构建过程。

Pc模拟版的构建通过调用如下命令实现。

  1. system("$msdevMoDIS.dsw/MAKE\"$argu-Win32$modisDir\"  
  2. /OUT${MoDISLogDir}\\${argu}.log") 

在这里$msdev就是VC的msdev,通过VC的工程文件MoDIS.dsw和后面的参数进行具体的构建过程。熟悉VC工程的朋友应该比较清楚,因此就不再具体解释了。之后将只以ARM版为主来讲解整个工程的构建过程。

ARM版的构建通过调用如下命令实现。

  1. system("${makeCmd}-f${makeFolder}${myMF}-r-R  
  2. CUSTOMER=$customPROJECT=$project$action") 

在这里${makeCmd}是tools\make.exe,即GNU的make,${makeFolder}${myMF}是make\Gsm2.mak,$action是new、update、remake等。变量CUSTOMER和PROJECT分别是客户名和项目名,在构建过程中将根据此两个变量的值选定项目相关的配置文件,从而实现客户化的定制。通过给make指定ARM版的核心Makefile文件Gsm2.mak,开始了ARM版的构建过程。

Gsm2.mak文件中包含了Option.mak这个配置用的Makefile文件,另外还包含了一些以.tmp和.bld为后缀的由perl脚本make2.pl生成的临时配置文件。这些临时配置文件主要是一些action如clean、remake等所需的变量设置,及客户化和版本号等的一些信息。Gsm2.mak控制了new、update、remake等动作的过程。具体分别如下所示。

  1. new:cleanallcmmgenmmi_feature_checkasngencodegenasnregen\  
  2. operator_check_liteupdate  
  3. update:cleanlogcleanbinmcddll_updatecodegenresgencksysdrvremake  
  4. remake:cleanlogcleanbingenvernolibs$(BIN_FILE)done 

上面的构建过程的几个步骤中,最重要的两个步骤是libs、$(BIN_FILE)。libs调用ARM版的编译器和连接器将各个模块目录下的C文件编译链接为独立的库。$(BIN_FILE)这个步骤将各个模块编译链接得到的库和mtk_lib目录下的库一起链接起来得到一个映像文件,然后使用ADS的工具fromelf将映像文件生成以变量BIN_FILE命名的二进制文件,该文件可以下载到硬件板上运行。

libs这个步骤如下所示。

  1. libs:cleanlibstartbuildlibs$(COMPLIBLIST) 

libs中真正进行编译链接的步骤是$(COMPLIBLIST),要生成的库由变量COMPLIBLIST列出,在ARM版中,变量COMPLIBLIST从变量COMPLIST得到。变量COMPLIST是在Option.mak及其包含的Makefile文件中赋值的。因有很多库需要编译链接,变量COMPLIBLIST展开后包含多个步骤,而这些步骤都是重复不变的,因此在定义步骤$(COMPLIBLIST)的构建过程时使用%.lib代替。%.lib这个步骤先清除了之前的一些依赖关系文件,将一些变量的设置写入~compbld.tmp这个临时文件中,然后给make指定Makefile文件comp.mak,完成库的编译和链接,如下所示。

  1. %.lib:  
  2. …  
  3. @if/I%OS%EQUWINDOWS_NT\  
  4. (if/I$(BM_NEW)EQUTRUE\  
  5. (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)  
  6. \  
  7. else\  
  8. (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log2>&1)\  
  9. )\  
  10. else\  
  11. (if/I$(BM_NEW)EQUTRUE\  
  12. (tools\make.exe-fmake\comp.mak-k-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\  
  13. else\  
  14. (tools\make.exe-fmake\comp.mak-r-R$(strip$(CMD_ARGU))COMPONENT=$*>$(strip$(COMPLOGDIR))\$*.log)\  

上面的命令语句中,参数-k是指有错误也要继续编译,-r和-R是指没有GNUmake的默认规则和变量。COMPONENT=$*把当前要生成的库赋给变量COMPONENT。要注意%.lib匹配了所有要生成的库,但这个步骤一次只生成一个模块的库,这个步骤对所有匹配到的库都会执行一次。

comp.mak这个Makefile文件控制了模块的编译链接过程。在这个文件中,首先将当前模块要生成的库(由变量COMPONENT传入)设置给了变量TARGLIB。之后从.lis文件中得到SRC_LIST和CPPSRC_LIST两个源文件列表,设定要编译的C文件、C++文件、汇编文件等的列表,和要链接的中间目标文件的列表。将.inc、.def、.pth文件中的头文件路径、C文件路径、编译链接参数等赋值给相应的变量。将平台相关(如6223、6225)的编译参数加上,确定使用ARM编译器还是thumb编译器,是否支持ARM指令和thumb指令的interwork模式。最后进入库的编译链接过程。

库的编译链接由update_lib步骤完成,这个步骤直接依赖了$(TARGLIB)。目标$(TARGLIB)是由所有按照.c.obj、.s.obj、%.obj:%.cpp等规则编译得到的中间目标文件链接得到的。其主要过程如下所示。

  1. $(TARGLIB):  
  2. ...  
  3. @ifexist$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib\  
  4. (copy/z$(FIXPATH)\$(CUS_MTK_LIB)\$(COMPONENT).lib$(subst/,\,$(TARGLIB)))&\  
  5. ($(LIB)-r$(TARGLIB)$(COMPOBJS_DIR)/*.obj)\  
  6. else\  
  7. ($(LIB)-create$(TARGLIB)$(COMPOBJS_DIR)/*.obj)  
  8. ... 

Option.mak是整个工程构建过程中的总控配置文件,在这个文件中还包含了_ .mak和REL_CR_MMI_ .mak这两个项目相关的配置文件,用户自定义的配置文件USER_SPECIFIC.mak,另外还包含了一些临时生成的配置文件。这些配置文件在一起设置了工程构建过程中用到的编译器、链接器,库和二进制的工具,设置了编译链接时的参数,公共的头文件路径,设置了需要包含mtk_lib目录中的哪些既有的库,设置了需要生成的库等一系列相关的设置,这些设置都由一些重要的变量保存。

 

 

 

小结:解析MTK手机软件系统构建过程的内容介绍完了,希望通过学习MTK手机软件系统的构建能对你有所帮助。

责任编辑:zhaolei 来源: 百度博客
相关推荐

2011-09-06 10:24:11

2011-09-05 17:07:45

MTK手机软件

2011-09-05 18:49:50

MTK手机软件系统

2009-11-26 10:45:41

Linux手机软件趋势分析

2009-12-21 16:57:25

2009-06-12 12:45:53

2023-06-08 07:37:42

Docker容器

2011-11-04 14:40:58

金山手机软件

2009-11-12 09:17:07

手机软件开发

2010-02-06 15:19:35

2009-03-15 09:50:44

诺基亚手机OS苹果

2015-11-25 13:04:38

EMUI

2011-08-30 16:32:41

MTK开发环境

2011-09-06 14:10:18

MTK系统时间

2009-03-31 18:03:27

商店手机软件WM

2009-06-11 15:25:41

2009-09-02 11:16:36

软件商店联通

2009-09-09 09:23:10

手机软件商店

2014-03-17 09:52:33

点赞
收藏

51CTO技术栈公众号