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到板子对应的目录下。