2.Android源代码编译命令m和mm和mmm以及make分析

上传人:豆浆 文档编号:30267076 上传时间:2018-01-28 格式:DOC 页数:28 大小:226.50KB
返回 下载 相关 举报
2.Android源代码编译命令m和mm和mmm以及make分析_第1页
第1页 / 共28页
2.Android源代码编译命令m和mm和mmm以及make分析_第2页
第2页 / 共28页
2.Android源代码编译命令m和mm和mmm以及make分析_第3页
第3页 / 共28页
2.Android源代码编译命令m和mm和mmm以及make分析_第4页
第4页 / 共28页
2.Android源代码编译命令m和mm和mmm以及make分析_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《2.Android源代码编译命令m和mm和mmm以及make分析》由会员分享,可在线阅读,更多相关《2.Android源代码编译命令m和mm和mmm以及make分析(28页珍藏版)》请在金锄头文库上搜索。

1、老罗的新浪微博: http:/ Android 编译环境的初始化过程。 Android 编译环境初始化完成后,我们就可以用 m/mm/mmm/make 命令编译源代码了。当然,这要求每一个模块都有一个 Android.mk 文件。Android.mk 实际上是一个 Makefile 脚本,用来描述模块编译信息。Android 编译系统通过整合 Android.mk 文件完成编译过程。本文就对 Android 源代码的编译过程进行详细分析。从前面 Android 编译系统环境初始化过程分析这篇文章可以知道, lunch 命令其实是定义在 build/envsetup.sh 文件中的函数 lunc

2、h 提供的。与 lunch 命令一样,m 、mm 和mmm 命令也分别是由定义在 build/envsetup.sh 文件中的函数 m、mm 和 mmm 提供的,而这三个函数又都是通过 make 命令来对源代码进行编译的。事实上,命令 m 就是对make 命令的简单封装,并且是用来对整个 Android 源代码进行编译,而命令 mm 和mmm 都是通过 make 命令来对 Android 源码中的指定模块进行编译。接下来我们就先分别介绍一下函数 m、mm 和 mmm 的实现,然后进一步分析它们是如何通过 make 命令来编译代码的。函数 m 的实现如下所示:1. function m() 2.

3、 3. T=$(gettop) 4. if $T ; then 5. make -C $T $ 6. else 7. echo Couldnt locate the top of the tree. Try setting TOP. 8. fi 9. 函数 m 调用函数 gettop 得到的是 Android 源代码根目录 T。在执行 make 命令的时候,先通过-C 选项指定工作目录为 T,即 Android 源代码根目录,接着又将执行命令 m 指定的参数$作为命令 make 的参数。从这里就可以看出,命令 m 实际上就是对命令 make 的简单封装。函数 mm 的实现如下所示:1. fun

4、ction mm() 2. 3. # If were sitting in the root of the build tree, just do a 4. # normal make. 5. if -f build/core/envsetup.mk -a -f Makefile ; then 6. make $ 7. else 8. # Find the closest Android.mk file. 9. T=$(gettop) 10. local M=$(findmakefile) 11. # Remove the path to top as the makefilepath nee

5、ds to be relative 12. local M=echo $M|sed s:$T/: 13. if ! $T ; then 14. echo Couldnt locate the top of the tree. Try setting TOP. 15. elif ! $M ; then 16. echo Couldnt locate a makefile from the current directory. 17. else 18. ONE_SHOT_MAKEFILE=$M make -C $T all_modules $ 19. fi 20. fi 21. 函数 mm 首先是

6、判断当前目录是否就是 Android 源码根目录,即当前目录下是否存在一个 build/core/envsetup.mk 文件和一个 Makefile 文件。如果是的话,就将命令 mm 当作是一个普通的 make 命令来执行。否则的话,就调用函数 findmakefile 从当前目录开始一直往上寻找是否存在一个 Android.mk 文件。如果在寻找的过程中,发现了一个Android.mk 文件,那么就获得它的绝对路径,并且停止上述寻找过程。由于接下来执行 make 命令时,我们需要指定的是要编译的 Android.mk 文件的相对于 Android 源码根目录路径,因此函数 mm 需要将刚才

7、找到的 Android.mk 绝对文件路径 M 中与 Android 源码根目录 T 相同的那部分路径去掉。这是通过 sed 命令来实现的,也就是将字符串 M 前面与字符串 T 相同的子串删掉。最后,将找到的 Android.mk 文件的相对路径设置给环境变量 ONE_SHOT_MAKE,表示接下来要对它进行编译。另外,函数 mm 还将 make 命令目标设置为 all_modules。这是什么意思呢?我们知道,一个 Android.mk 文件同时可以定义多个模块,因此,all_modules 就表示要对前面指定的 Android.mk 文件中定义的所有模块进行编译。函数 mmm 的实现如下所

8、示:plain view plaincopy1. function mmm() 2. 3. T=$(gettop) 4. if $T ; then 5. local MAKEFILE= 6. local MODULES= 7. local ARGS= 8. local DIR TO_CHOP 9. local DASH_ARGS=$(echo $ | awk -v RS= -v ORS= /-.*$/) 10. local DIRS=$(echo $ | awk -v RS= -v ORS= /-.*$/) 11. for DIR in $DIRS ; do 12. MODULES=echo

9、$DIR | sed -n -e s/.*:.$/1/p | sed s/,/ / 13. if $MODULES = ; then 14. MODULES=all_modules 15. fi 16. DIR=echo $DIR | sed -e s/:.*/ -e s:/$: 17. if -f $DIR/Android.mk ; then 18. TO_CHOP=(cd -P - $T & pwd -P) | wc -c | tr -d 19. TO_CHOP=expr $TO_CHOP + 1 20. START=PWD= /bin/pwd 21. MFILE=echo $START

10、| cut -c$TO_CHOP- 22. if $MFILE = ; then 23. MFILE=$DIR/Android.mk 24. else 25. MFILE=$MFILE/$DIR/Android.mk 26. fi 27. MAKEFILE=$MAKEFILE $MFILE 28. else 29. if $DIR = snod ; then 30. ARGS=$ARGS snod 31. elif $DIR = showcommands ; then 32. ARGS=$ARGS showcommands 33. elif $DIR = dist ; then 34. ARG

11、S=$ARGS dist 35. elif $DIR = incrementaljavac ; then 36. ARGS=$ARGS incrementaljavac 37. else 38. echo No Android.mk in $DIR. 39. return 1 40. fi 41. fi 42. done 43. ONE_SHOT_MAKEFILE=$MAKEFILE make -C $T $DASH_ARGS $MODULES $ARGS 44. else 45. echo Couldnt locate the top of the tree. Try setting TOP

12、. 46. fi 47. 函数 mmm 的实现就稍微复杂一点,我们详细解释一下。首先,命令 mmm 可以这样执行:1. $ mmm . :module-1,module-2,.,module-M 其中,dir-1 、dir-2、dir-N 都是包含有 Android.mk 文件的目录。在最后一个目录 dir-N 的后面可以带一个冒号,冒号后面可以通过逗号分隔一系列的模块名称 module-1、module-2 和 module-M,用来表示要编译前面指定的 Android.mk 中的哪些模块。知道了命令 mmm 的使用方法之后 ,我们就可以分析函数 mmm 的执行逻辑了:1. 调用函数 get

13、top 获得 Android 源码根目录。2. 通过命令 awk 将执行命令 mmm 时指定的选项参数提取出来,也就是将以横线“-”开头的字符串提取出来,并且保存在变量 DASH_ARGS 中。3. 通过命令 awk 将执行命令 mmm 时指定的非选项参数提取出来,也就是将非以横线“-”开头的字符串提取出来,并且保存在变量 DIRS 中。这里得到的实际上就是跟在命令mmm 后面的字符串“ . :module-1,module-2,.,module-M”。4. 变量 DIRS 保存的字符串可以看成是一系以空格分隔的子字符串,因此,就可以通过一个 for 循环来对这些子字府串进行遍历。每一个子字符串 DIR 描述的都是一个包含有Android.mk 文件的目录。对每一个目录 DIR 执行以下操作:4.1 由于目录 DIR 后面可能会通过冒号指定有

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号