T=$(gettop)
    local M=$(findmakefile)
    # Remove the path to top as the makefilepath needs to be relative
    local M=`echo $M|sed 's:'$T'/::'`
    if [ ! "$T" ]; then
        echo "Couldn't locate the top of the tree.  Try setting TOP."
    elif [ ! "$M" ]; then
        echo "Couldn't locate a makefile from the current directory."
    else
        ONE_SHOT_MAKEFILE=$M make -C $T all_modules $@
    fi
fi


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


        最后,将找到的Android.mk文件的相对路径设置给环境变量ONE\_SHOT\_MAKE,表示接下来要对它进行编译。另外,函数mm还将make命令目标设置为all\_modules。这是什么意思呢?我们知道,一个Android.mk文件同时可以定义多个模块,因此,all\_modules就表示要对前面指定的Android.mk文件中定义的所有模块进行编译。


**函数mmm的实现如下所示:**
function mmm()
 {
 T=T" ]; then
 local MAKEFILE=
 local MODULES=
 local ARGS=
 local DIR TO_CHOP
 local DASH_ARGS=@" | awk -v RS=" " -v ORS=" " ‘/^-.*(echo "KaTeX parse error: Double superscript at position 35: …-v ORS=" " '/^[^̲-].*/’)
 for DIR in $DIRS ; do
 MODULES=echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /' if [ “$MODULES” = “” ]; then
 MODULES=all_modules
 fi
 DIR=echo $DIR | sed -e 's/:.*//' -e 's:/$::' if [ -f $DIR/Android.mk ]; then
 TO_CHOP=(cd -P -- $T && pwd -P) | wc -c | tr -d ' ' TO_CHOP=expr $TO_CHOP + 1 START=PWD= /bin/pwd MFILE=echo $START | cut -c${TO_CHOP}- if [ “DIR/Android.mk
 else
 MFILE=DIR/Android.mk
 fi
 MAKEFILE=”$MAKEFILE DIR" = snod ]; then
 ARGS=“DIR” = showcommands ]; then
 ARGS=“DIR” = dist ]; then
 ARGS=“DIR” = incrementaljavac ]; then
 ARGS=“$ARGS incrementaljavac”
 else
 echo “No Android.mk in MAKEFILE” make -C $T $DASH_ARGS $MODULES $ARGS
 else
 echo “Couldn’t locate the top of the tree. Try setting TOP.”
 fi
 }
函数mmm的实现就稍微复杂一点:


## 三.mm编译模块实例


要使用m、mm、mmm命令对Android代码进行模块编译,需要先执行如下命令初始化环境。

source build/envsetup.sh

lunch

![]()


![]()


mm编译成功后,在编译log会显示生成的so库。 


![]()


在根目录find -name " " 搜索编译生成的so,然后push到板子对应的目录下。