Android中m、mm、mmm、mma、mmma的区别

本文详细介绍了安卓系统中m、mm、mmm等命令的区别及使用方法,并解释了编译过程涉及的主要makefile文件及其作用。

m:编译整个安卓系统

     makes from the top of the tree

mm:编译当前目录下的模块,当前目录下需要有Android.mk这个makefile文件,否则就往上找最近的Android.mk文件。

         builds all of the moudles in the current directory

         mma:当前目录新增或删除文件后,可以用mma重新编译。

mmm:编译指定路径下的模块,指定的路径下面需要有Android.mk这个makefile文件

             builds all of the moudles in the supplies directory

            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源代码中的所有模块进行编译。


mm、mmm是类似的,都是用来编译某些模块。

使用这些编译命令,首先需要在Android根目录下配置环境

#source  build/envsetup.sh         要确保当前根目录下有envsetup.sh脚本文件
#choose...                         对环境的选择
#cd (要编译模块所在的目录)
#mm(mma、mmm、mmma) -B -j2  2>&1    开始编译模块
注:-B表示编译模块的所有文件,-j2表示编译的时候开启两个线程,2>&1表示将错误切换到输出(输入为0,输出为1,错误为2)。  
   envsetup.sh脚本文件里包含vendorsetup.sh 、lunch、 m mm mmm的定义





<think>我们正在讨论Android源码编译中的mmmmma命令。根据AOSP的构建系统,这两个命令都是用于模块编译的快捷命令,但作用范围有所不同。首先,mmm命令用于编译指定目录下的模块。例如,如果你修改了frameworks/base目录下的代码,可以使用:```mmmframeworks/base```这样只会编译frameworks/base目录下的模块,而不会编译整个系统。mma命令则用于编译当前目录下的模块。假设你当前位于frameworks/base目录,那么直接运行:```mma```就会编译当前目录(即frameworks/base)下的模块。两者的主要区别在于:1.mmm需要指定目录路径作为参数,而mma不需要参数(它使用当前工作目录)。2.mmm可以编译任意指定路径的模块,而mma只能编译当前目录的模块。使用场景:-当你明确知道要编译的模块所在路径时,使用mmm命令。-当你在模块所在的目录下工作时,使用mma命令更为方便。另外,这两个命令都会自动处理依赖关系,但只会编译指定模块及其直接依赖,而不会重新编译整个系统。注意:使用mmmmma前,需要先执行`.build/envsetup.sh`来初始化环境,包括这些命令。参考引用[3]中提到,AOSP使用repo工具管理多个git项目,而构建系统则使用Make和Soong(Android.mk和Android.bp)。在编译单个模块时,我们可以利用这些命令提高效率。相关问题:1.如何查看Android源码中支持mmmmma命令的其他快捷命令?2.使用mmm编译模块后,如何将其推送到设备上测试?3.在编译模块时,如何处理常见的依赖错误?</think>### Android源码编译中`mmm`与`mma`命令的区别与使用场景 在AOSP(Android Open Source Project)编译过程中,`mmm`和`mma`是两个常用的模块级编译命令,它们基于Android的构建系统(Make/Soong)实现高效局部编译。 #### 核心区别 | 命令 | 作用范围 | 参数要求 | 依赖处理 | |------|------------------------------|----------------------|------------------------| | `mmm` | **指定目录**下的所有模块 | 必须提供目录路径参数 | **仅编译目标模块** | | `mma` | **当前工作目录**下的所有模块 | **无需参数** | **编译目标模块+依赖** | #### 详细说明 1. **`mmm`命令** - 语法:`mmm <目录路径>` - 示例:编译`frameworks/base`目录下的所有模块 ```bash mmm frameworks/base ``` - **特点**: - 仅编译指定路径的模块,**不自动处理依赖项** - 需手动确保依赖模块已预先编译(否则可能失败) - 适用于**已知依赖已就绪**的场景 2. **`mma`命令** - 语法:`mma`(必须在目标模块目录内执行) - 示例:在`packages/apps/Settings`目录下执行 ```bash cd packages/apps/Settings && mma ``` - **特点**: - **自动解析并编译当前模块的所有依赖** - 无需手动指定路径(依赖工作目录位置) - 适用于**修改代码后快速验证**的场景 #### 使用场景对比 - **`mmm`适用场景** - 编译系统核心模块(如`frameworks/base`) - 当依赖项未改动时(如仅修改单个模块的实现) - 需要精确控制编译范围的调试过程 - **`mma`适用场景** - 应用层开发(如修改`packages/apps`下的APP) - 不确定依赖是否更新的情况(自动保障兼容性) - 快速迭代测试(避免全系统编译耗时) #### 工作流程示例 ```mermaid graph TD A[修改代码] --> B{是否在模块目录内?} B -->|是| C[执行 mma] B -->|否| D[执行 mmm <路径>] C --> E[自动编译依赖+目标] D --> F[仅编译目标模块] E & F --> G[生成产物 .apk/.so] G --> H[adb push 到设备测试] ``` > **注意**:使用前需通过`. build/envsetup.sh`初始化环境[^3][^4]。编译产物(如`system.img`、APK)默认输出到`out/target/product/<device>/`目录[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值