Android编译中m、mm、mmm的区别

本文详细介绍了在Android编译过程中,m、mm、mmm这三个命令的用途和区别。m用于编译全部模块,mm用于当前目录下的模块编译,mmm则针对指定模块的根目录进行编译。正确使用这些命令能提高编译效率,特别是在只需要修改个别模块时。文章提醒读者,执行命令前需确保位于源码目录,并注意命令后的空格,且只有包含Android.mk文件的目录才被视为模块根目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/********************************************************************************************
 * author:conowen@大钟                                                                                                                          
 * E-mail:conowen@hotmail.com                                                                                                             
 * http://blog.youkuaiyun.com/conowen                                                                                                              
 * 注:本文为原创,仅作为学习交流使用,转载请标明作者及出处。     

 ********************************************************************************************/


m、mm、mmm命令可以让你只编译单独模块,而不用费大量的时间比编译整个Android系统。


要使用m、mm、mmm命令,需要在源码目录下执行如下命令。(点与build之间是有空格的)

 . build/envsetup.sh

否则会提示命令找不到

No command 'mmm' found, did you mean:
 Command 'mwm' from package 'motif-clients' (multiverse)
 Command 'mwm' from package 'lesstif-bin' (universe)
 Command 'mgm' from package 'mgm' (universe)
 Command 'rmm' from package 'nmh' (universe)
 Command 'rmm' from package 'mailutils-mh' (universe)
 Command 'mmv' from package 'mmv' (universe)
 Command 'mmd' from package 'mtools' (main)
 Command 'mmg' from package 'mkvtoolnix-gui' (universe)
 Command 'mm' from package 'mountmanager' (universe)
 Command 'mm' from package 'multimail' (universe)


可以使用help来检示有哪些指令可以使用

Invoke ". build/envsetup.sh" from your shell to add thefollowing functions to your environment:

- croot:   Changes directory to the top of the tree.
- m:       Makesfrom the top of the tree.
- mm:      Builds all of the modules in the currentdirectory.
- mmm:     Builds all of the modules in the supplieddirectories.
- cgrep:   Greps on all local C/C++ files.
- hgrep:   Greps on all local C/C++ header files.
- jgrep:   Greps on all local Java files.
- mkgrep:  Greps on all local make files.
- rcgrep:  Greps on all local .rc files.
- resgrep: Greps on all local res/*.xml files.
- shgrep:  Greps on all local .sh files.
- godir:   Go to the directory containing a file.

其中对模块的编译有辅助说明的是tapas、m、mm、mmm这几个指令

其中mmm后面要跟模块的根目录,不是所有的目录下都有子模块,那些含有Android.mk档案目录才是模块的根目录,模块名可以从Android.mk的LOCAL_MODULE或者LOCAL_PACKAGE_NAME变数中得到。

1、单独编译某模块,需要在mmm后面指定模块路径,例如编译ffmpeg 中的libjnivideo

conowen@ideal:~/conowen_android/android4.0$ mmm frameworks/base/native/video/jni
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=4.0.1
TARGET_PRODUCT=full
TARGET_BUILD_VARIANT=eng
TARGET_BUILD_TYPE=release
TARGET_BUILD_APPS=
TARGET_ARCH=arm
TARGET_ARCH_VARIANT=armv7-a
HOST_ARCH=x86
HOST_OS=linux
HOST_BUILD_TYPE=release
BUILD_ID=ITL41D
============================================


2、或者可以跳转到你想编译模块相对应目录下执行“mm”命令。

           就可以编译单独的模块,事实上,这个命令与mmm命令没有本质的区别。


3、用 m 编译全部的模块

conowen@ideal:~/conowen_android/android4.0$ m 

你也可以在src目录下直接执行


conowen@ideal:~/conowen_android/android4.0$ make module_name     




<think>好的,现在我要解决用户关于安卓系统中单编命令的问题。首先,我需要明确用户的需求。用户提到“单编命令”,这通常指的是单独编译某个模块或文件的命令,而不是整个系统。根据之前的对话,用户可能是在开发Android应用或系统时,希望只编译特定的部分以节省时间。 首先,我得回忆一下Android编译系统。根据之前的引用,Android使用Makefile系统,特别是Android.mk文件来定义模块的编译规则。现在Android主要转向使用Soong和Blueprint,但很多项目可能还在使用旧的make命令。单编命令通常涉及使用`mmm`或`mm`命令,这些属于Android编译工具。 接下来,我需要确认用户的环境。用户是否在AOSP(Android Open Source Project)环境下工作?如果是的话,`mmm`和`mm`是常用的单编命令。但需要确保他们已经执行了环境设置脚本,比如`source build/envsetup.sh`和`lunch`选择了正确的设备。 然后,用户可能想知道具体的使用方法。例如,如何指定模块路径,如何清理编译结果,或者如何处理依赖。此外,用户可能遇到常见问题,比如命令找不到,这时候需要检查环境变量是否正确设置。 另外,用户提到的单文件编译,在Android中并不常见,因为通常以模块为单位编译。但可能可以通过修改Android.mk或使用其他工具如clang直接编译单个文件,不过这可能比较复杂,需要具体指导。 还需要考虑用户可能的进阶需求,比如如何优化编译速度,或者如何整合到IDE中。例如,Android Studio支持NDK开发,可能有更简便的方式。 最后,要确保回答结构清晰,分步骤说明,包括基本命令、参数说明、示例、注意事项和常见问题。同时,根据之前的引用,可能需要提到相关环境配置,如PATH设置,或者使用grep和find命令查找模块,如用户之前提到的Linux命令。 需要验证信息的准确性,比如`mmm`和`mm`的使用方法是否正确,是否在envsetup.sh之后可用。同时,注意用户可能混淆了系统级编译和应用级编译,需要明确上下文。 总结,回答应包括单编命令的基本用法、示例、环境准备、常见问题解决,以及可能的进阶技巧,如CCACHE的使用。还要提醒用户注意模块依赖和清理步骤,确保他们能顺利执行单编操作。</think>#### 安卓系统单编命令使用指南(基于AOSP编译系统) ### #### 一、单编命令核心原理 Android单文件/模块编译基于`Makefile`编译系统实现,通过`mmm`和`mm`命令实现精准编译: - `mmm`:指定模块路径进行编译(需绝对/相对路径) - `mm`:在当前目录查找`Android.mk`执行编译[^2][^3] #### 二、环境准备步骤 ```bash # 初始化编译环境(必须步骤) source build/envsetup.sh # 选择目标设备(例如选择aosp_arm-eng) lunch aosp_arm-eng ``` #### 三、单编命令具体用法 1. **模块级编译**(最常用场景) ```bash # 编译指定路径的模块(示例:编译Settings应用) mmm packages/apps/Settings/ # 编译当前目录模块(需在Android.mk所在目录执行) mm ``` 2. **带清理的编译**(强制重新编译) ```bash mmm -B packages/apps/Camera2/ ``` 3. **查看编译命令**(调试用) ```bash mmm --show-commands frameworks/base/services/ ``` #### 四、关键参数说明 | 参数 | 作用 | |------|------| | `-jN` | 指定并行编译线程数(如`-j8`) | | `-d` | 显示详细调试信息 | | `-k` | 遇到错误继续编译后续模块 | | `-n` | 仅打印命令不执行 | #### 五、编译产物定位 - 生成的APK路径:`out/target/product/[设备名]/system/app/[模块名]` - 生成的JAR路径:`out/target/common/obj/JAVA_LIBRARIES/[模块名]_intermediates` #### 六、特殊场景处理 1. **NDK单编C/C++模块** ```bash # 本地编译调试(示例:编译native库) ndk-build NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk ``` 2. **Gradle整合编译**(兼容Android Studio) ```bash ./gradlew :app:assembleDebug --rerun-tasks ``` #### 七、常见错误排查 1. **`mmm: command not found`** 执行`source build/envsetup.sh`初始化环境[^3] 2. **`No rule to make target`** 检查模块路径是否正确,确认`Android.mk`存在 3. **依赖缺失错误** 先编译依赖模块:`mmm frameworks/base/`[^2] #### 八、编译加速技巧 ```bash # 启用CCache缓存(在环境初始化前设置) export USE_CCACHE=1 ccache -M 50G # 设置缓存大小 ``` ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值