m mm等和envsetup.sh
一、envsetup.sh简介
Android 完成编译的时候先执行 source build/envsetup.sh。在这个shell 脚本中定义了 help, croot, m, mm, mmm 等 function,这些function可以作为命令行工具使用。
source命令:source 命令会把对应脚本中的内容读取到当前的bash 解释器中,在当前的执行环境中执行;其中定义的 function 以及通过 export 声明的变量等在 source 执行结束之后依然存在于当前的bash 环境中。比如我们常用的 source .bashrc 或者 source .profile等目的是为了引用刚刚改动过的环境变量。
envsetup.sh中提供一下工具:
lunch:lunch<product_name> - <build_variant>
tapas:tapas[<App1> <App2> ...] [arm | x86 | mips] [eng | userdebug | user]
croot:将目录更改为树的顶部。
m:从树顶make。
mm:构建(build)当前目录中的所有模块。
mmm:构建(build)所提供目录中的所有模块。
cgrep:Greps所有本地C/C ++文件。
jgrep:Greps所有本地Java文件。
resgrep:Greps on all local res/*.xml文件。
godir:到包含文件的目录。
add_lunch_combo:在lunch函数的菜单中添加一个条目
m:编译整个安卓系统。
mm:编译当前目录下的模块,当前目录下需要有Android.mk,否则就往上找最近的Android.mk文件。
mma:当前目录新增或删除文件后,可以用mma重新编译。
mmm:编译指定路径下的模块,指定的路径下面需要有Android.mk。
mmma:指定目录下新增或删除文件后,可以用mmma重新编译。(未全编译的情况系下,可以使用该命令单编译模块)
mmm的编译过程:
build/core/main.mk(是Android编译系统的入口文件)
->build/core/config.mk(会定好编译类型和目标文件)
->build/core/definitions.mk(定义在编译过程中用到的宏)
->ONE_SHOT_MAKEFILE->build/core/package.mk(编译Apk库文件)
->build/core/java_library.mk(编译Java库文件)
->build/core/static_java_library.mk(编译Java静态库文件)
->build/core/shared_library.mk->build/core/dynamic_library.mk->build/core/binary.mk->build/core/base_rules.mk
->build/core/static_library.mk(编译.a静态库文件)
->build/core/executable.mk(编译可执行文件)
->build/core/prebuilt.mk(编译已经预编译好的第三方库文件)
->build/core/Makfile(有system.img、boot.img、recovery.img等镜像文件生成规则)
环境变量ONE_SHOT_MAKEFILE中存放要编译模块的Android.mk的文件路径,如果环境变量值为空,表示执行的是m或者make命令,会对Android源代码中的所有模块进行编译(bug)。
1. m
当在任何一个目录下打 m 的时候, 它会执行下面的function.
function m()
{
T=$(gettop)
if [ "$T" ]; then
make -C $T $@
else
echo "Couldn't locate the top of the tree. Try setting TOP."
fi
}
$@ 返回调用这个脚本时传入的参数,比如执行$ m showcommands -d 经过 function m 的翻译后就执行
make -C /home/yajun/Android/an403 showcommands -d $T可以使用 $ gettop 来查看,若当前目录不在源码树中,$T就为空,打印上面的错误信息。
2. mm
build当前目录中的所有模块
function mm()
{
# If we're sitting in the root of the build tree, just do a
# normal make.
if [ -f build/core/envsetup.mk -a -f Makefile ]; then
make $@
else
# Find the closest Android.mk file.
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 的时候,它首先现判断当前目录是不是 TOP 目录,如果是,就直接开始make 了,如果不是,就调用findmakefile 寻找 Android.mk , 搜索的路径是 当前目录-> 父目录 -> 父目录 -> ... -> 到根目录.
function findmakefile()
{
TOPFILE=build/core/envsetup.mk
# We redirect cd to /dev/null in case it's aliased to
# a command that prints something as a side-effect
# (like pushd)
local HERE=$PWD
T=
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
T=`PWD= /bin/pwd`
if [ -f "$T/Android.mk" ]; then
echo $T/Android.mk
cd $HERE > /dev/null
return
fi
cd .. > /dev/null
done
cd $HERE > /dev/null
}
当在某个目录下找到Android.mk后,就把它echo 出来。然后 cd $HERE 返回调用 findmakefile 的目录。
3. gettop
返回源码的顶层目录,如果这个目录存在。
function gettop
{
local TOPFILE=build/core/envsetup.mk
if [ -n "$TOP" -a -f "$TOP/$TOPFILE" ] ; then
echo $TOP
else
if [ -f $TOPFILE ] ; then
# The following circumlocution (repeated below as well) ensures
# that we record the true directory name and not one that is
# faked up with symlink names.
PWD= /bin/pwd
else
# We redirect cd to /dev/null in case it's aliased to
# a command that prints something as a side-effect
# (like pushd)
local HERE=$PWD
T=
while [ \( ! \( -f $TOPFILE \) \) -a \( $PWD != "/" \) ]; do
cd .. > /dev/null
T=`PWD= /bin/pwd`
done
cd $HERE > /dev/null
if [ -f "$T/$TOPFILE" ]; then
echo $T
fi
fi
fi
}
如果这个目录存在,比如在我的机器上是:
$ gettop
/media/ubuntu/works/tiny4412/android-5.0.2
4.croot
回到顶层目录,测试如下:
root@ubuntu:/media/ubuntu/works/tiny4412/android-5.0./frameworks/support/v4/froyo# croot
root@ubuntu:/media/ubuntu/works/tiny4412/android-5.0.#
6. godir
转到对应文件所在的目录中,测试如下:
root@ubuntu:/media/ubuntu/works/tiny4412/android-5.0.# godir InputReader.cpp
[] ./external/lldb/source/API
[] ./external/lldb/source/Core
[] ./frameworks/native/services/inputflinger
Select one:
root@ubuntu:/media/ubuntu/works/tiny4412/android-5.0./frameworks/native/services/inputflinger#
7. cgreop
在C/C++文件中检索字符串,测试如下:
# cgrep EventHub
二、Android.mk中的LOCAL_MODULE_TAGS 选项说明
LOCAL_MODULE_TAGS :=user eng tests optional
user: 指该模块只在user版本下才编译
eng: 指该模块只在eng版本下才编译
tests: 指该模块只在tests版本下才编译
optional:指该模块在所有版本下都编译
LOCAL_MODULE:= 这是对变量LOCAL_MODULE赋值为空!!
可以在.mk文件中打印变量linked_module的值进行查看:$(warning "linked_modle=$(linked_module)") 它会将“”中的内容打印出来。
参考:https://blog.csdn.net/yajun0601/article/details/7309010 对m mm分析的教详细
m mm等和envsetup.sh的更多相关文章
- Android编译执行envsetup.sh,产生工具命令m、mm、mmm、mmma、tapas 、croot、cgrep、jgrep、 resgrep、godir
一般来说编译一个sdk或者一个比较大的工程项目,第一步都是执行 envsetup.sh这个脚本,比如编译android,qt源码以及其他一些嵌入式的sdk. 而且执行的时候需要特别注意使用 sourc ...
- build/envsetup.sh 生成的命令详解表
参考: https://wiki.cyanogenmod.org/w/Envsetup_help 它是一个.sh文件,用source后就生成android编译相关函数,具体如下. 速查 Invokin ...
- 【转】Android source build/envsetup.sh学习笔记
原文网址:http://blog.csdn.net/mliubing2532/article/details/7567164 如果你只需要修改某一个模块的内容,但是却每次都要执行make, 最后等待很 ...
- build/envsetup.sh中hmm、get_abs_build_var、get_build_var解析
function hmm() { # 打印帮助信息 cat <<EOF Invoke ". build/envsetup.sh" from your shell to ...
- 【转】Android编译系统详解(一)——build/envsetup.sh
出处 http://www.cloudchou.com/android/post-134.html 本文原创作者:Cloud Chou. 欢迎转载,请注明出处和本文链接 准备好编译环境后,编译Rom的 ...
- build/envsetup.sh内lunch解析
........ # 测试device是否存在且是一个目录 并且 只查找device目录4层以上的子目录,名字为vendorsetup.sh 并且 将命令执行的错误报告直接送往回收站 不显示在屏幕上 ...
- 【Android】在build/envsetup.sh中添加自己的命令(函数)
由于测试的需要,经常需要手动刷入boot.img和system.img,把它写到envsetup.sh就可以每次使用一行命令来代替了: function flashtestimage(){ if [[ ...
- envsetup.sh 与 choosecombo
choose: 来定义编译选项, choosecombo 将会一步一步提示你输入相应的编译参数 https://blog.csdn.net/kickxxx/article/details/692518 ...
- [转载]Android 编译环境 build/envsetup.sh分析
2013-12-23 11:28:40 转载自: http://blog.csdn.net/evilcode/article/details/7005757 请到转载地址阅读原文, 转载以备查询.
随机推荐
- LeetCode--225--用队列实现栈
问题描述: 使用队列实现栈的下列操作: push(x) -- 元素 x 入栈 pop() -- 移除栈顶元素 top() -- 获取栈顶元素 empty() -- 返回栈是否为空 注意: 你只能使用队 ...
- android--------微信 Tinker 热修复 (一)
什么是热修复 热修复补丁(hotfix),又称为patch,指能够修复软件漏洞的一些代码,是一种快速.低成本修复产品软件版本缺陷的方式. 热修复有多种,如:Tinker ,QZone,Andfix, ...
- Zepto常见问题
Zepto遇到的问题 延时 总所周知,默认click事件,会有300ms的延时问题,Zepto的tap事件很好的解决了这个问题.但是也挖了一个大坑. 点透 Zepto的点透应该也是大家比较熟悉的了.当 ...
- kmp练习
kmp板子如下, 失配数组不优化的话, $f_i$就表示子串[0...i]前后缀最大匹配长度 int main() { scanf("%s%s", t, p); int n = s ...
- POJ-2689 Prime Distance (两重筛素数,区间平移)
Prime Distance Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13961 Accepted: 3725 D ...
- 牛客网——B-栈和排序
链接:https://www.nowcoder.com/acm/contest/58/B来源:牛客网 题目描述 给你一个1->n的排列和一个栈,入栈顺序给定 你要在不打乱入栈顺序的情况下,对数组 ...
- spring cloud shutdown graceful 优雅停机
spring cloud shutdown graceful 优雅停机 当一个服务启动后,会注册到eureka中,其他的服务也可以从eureka获取到新注册的服务.但当我们要停止一个服务的时候,如果直 ...
- 对比springmvc与struts2
转载:http://blog.csdn.net/chenleixing/article/details/44570681 1.Struts2是类级别的拦截, 一个类对应一个request上下文,Spr ...
- vue2.0对不同数据类型的显示
- QT分析之WebKit
该文章整理自 网易博客 http://blog.163.com/net_worm/blog/static/12770241920101831312381/ 转载请注明出处 WebKit是QT4新整合的 ...