当前位置: 首页 > news >正文

Android编译指令m、mm、mmm实战指南:从入门到精准构建

1. Android编译指令m、mm、mmm入门指南

第一次接触Android源码编译时,我被全系统编译的耗时吓到了——动辄几个小时起步。后来发现原来Google工程师早就考虑到了这个问题,提供了m、mm、mmm这三个神器。简单来说,它们就像厨房里的三种火力档位:大火(m)适合炖整锅汤,中火(mm)适合炒单个菜,小火(mmm)则能精确控制某个食材的火候。

要使用这些命令,首先得激活编译环境。这就像使用电器前要先插电一样基础。在源码根目录执行:

source build/envsetup.sh

注意这里有个新手常踩的坑:source和build之间必须有空格,而且建议用source替代点号(.),这样更规范。如果看到"command not found"错误,99%是因为漏了这一步。激活后可以用help命令查看所有可用指令,其中就包括我们重点关注的编译三剑客。

2. 三大编译指令深度解析

2.1 m指令:全系统编译的"核按钮"

当需要完整系统镜像时,m命令就是你的首选。它相当于Android版的"make all",会从头开始编译整个系统。我曾在骁龙835平台上测试过,完整编译耗时约2小时。虽然时间长,但在以下场景必不可少:

  • 首次刷机测试
  • 修改了系统级配置(如build.prop)
  • 更新了核心框架(如ART虚拟机)

执行方式极其简单:

m

或者更详细的版本:

m -j16 # 使用16线程并行编译

2.2 mm指令:当前目录的智能编译

mm(Make Module)是我日常使用最频繁的命令。它的智能之处在于会自动向上查找最近的Android.mk文件。比如在frameworks/base/core/jni目录下执行时,会自动识别该目录下的本地模块。

典型使用场景:

cd frameworks/base/core/jni mm

最近遇到个有意思的问题:当Android.mk文件不在当前目录时,新手容易困惑为什么mm不工作。其实只要确保所在目录在某个模块的子树中即可。比如在packages/apps/Camera/src下执行mm,系统会自动找到packages/apps/Camera/Android.mk

2.3 mmm指令:精准定位的编译导弹

mmm命令最强大的地方在于可以精确指定模块路径。比如要单独编译Settings应用:

mmm packages/apps/Settings

我整理了几个常用模块的编译示例:

  • 编译系统UI:mmm frameworks/base/packages/SystemUI
  • 编译HAL层:mmm hardware/interfaces/graphics/composer/2.1
  • 编译JNI库:mmm frameworks/base/core/jni

特别注意路径要指向包含Android.mk的目录,而不是源码目录。这是90%的mmm命令失败的原因。

3. 高级技巧与实战经验

3.1 增量编译的妙用

开发过程中最耗时的往往不是编码,而是等待编译。这时候mma(Make Module Again)就派上用场了。它会在以下场景自动检测变化:

  • 新增/删除源文件
  • 修改了Android.mk
  • 更新了资源文件

典型工作流:

mm # 首次编译 # 修改代码后 mma # 增量编译

3.2 编译参数调优

通过组合不同参数可以大幅提升效率:

mmm -j16 packages/apps/Settings # 多线程编译 mmm -B packages/apps/Settings # 强制重新编译

最近在调试Camera HAL时发现个技巧:添加showcommands参数可以显示详细编译命令:

mmm showcommands hardware/interfaces/camera

3.3 常见错误排查

  1. "No rule to make target"错误: 检查路径是否正确,确保目标目录包含Android.mk。我常用这个命令快速定位:

    find . -name Android.mk | grep camera
  2. 头文件找不到问题: 在Android.mk中添加:

    LOCAL_C_INCLUDES += $(TOP)/path/to/include
  3. 产物未更新: 尝试删除out目录下的中间文件:

    rm -rf out/target/product/[设备名]/obj/SHARED_LIBRARIES/[模块名]_intermediates

4. 典型模块编译实战

4.1 系统应用编译示例

以编译Settings应用为例:

cd ~/aosp source build/envsetup.sh lunch aosp_x86_64-eng # 选择目标设备 mmm packages/apps/Settings

编译完成后,产物会输出到:

out/target/product/[设备名]/system/priv-app/Settings/

4.2 HAL层模块编译

编译Camera HAL的完整流程:

mmm hardware/interfaces/camera # 推送生成的so库 adb root adb remount adb push out/target/product/[设备名]/system/lib64/hw/camera.[设备名].so /system/lib64/hw/ adb reboot

4.3 内核模块单独编译

虽然m/mm/mmm主要用于Android部分,但内核模块也可以单独编译:

cd kernel/msm-4.14 make -j16 modules_prepare make -j16 drivers/media/usb/uvc/uvcvideo.ko

5. 环境配置与工具链

5.1 自定义编译环境

在~/.bashrc中添加这些alias能极大提升效率:

alias m='make -j16' alias mm='make -j16 modules' alias mmm='make -j16 module-single'

5.2 编译缓存利用

开启ccache可以缩短30%以上编译时间:

export USE_CCACHE=1 ccache -M 50G # 设置缓存大小

5.3 IDE集成技巧

在Android Studio中配置外部工具:

  1. 打开Settings → Tools → External Tools
  2. 添加新工具,设置:
    • Program: /bin/bash
    • Arguments: -c "source build/envsetup.sh && mmm $ModulePath$"
  3. 在工程中右键即可快速编译当前模块

经过半年多的实践验证,这套编译方法使我的调试效率提升了近3倍。特别是在修改系统服务时,原本需要1小时的完整编译现在用mmm只需2分钟。记住关键原则:全系统改动用m,目录内修改用mm,精准定位用mmm。

http://www.jsqmd.com/news/1046057/

相关文章:

  • MATLAB半精度浮点数隐式转换Bug:数值噪声与确定性计算陷阱
  • FAST:解锁GNSS数据并行下载新范式,赋能高效科研与工程实践
  • 城通网盘直链神器:3步告别广告,获取高速下载链接
  • 2026邵阳2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 2026丽岙街道空调加氟推荐排行榜 - 品牌排行榜
  • 咸阳黄金回收避坑干货|一文看懂行业内幕,秦都万达实体店靠谱变现渠道 - 铭汇黄金回收
  • 倍福Hot Connect:解锁EtherCAT动态拓扑的工业实践
  • 打破直播平台壁垒:OBS多路RTMP推流插件深度解析与实践指南
  • 深入解析M68HC11E工作模式与内存映射:嵌入式开发核心机制
  • Hermes 本地 AI 智能代理完整部署实操教程,多系统适配配置指南
  • 深入解析SCI波特率容错与寄存器配置:嵌入式串口通信稳定性的关键
  • WarcraftHelper:5分钟解决魔兽争霸3在现代电脑上的5大兼容性问题
  • MC68HC908SR12 MMIIC接口与I/O端口配置实战解析
  • 3大核心问题解决方案:WarcraftHelper让你的魔兽争霸3重获新生
  • 如何免费解锁Wand游戏修改器高级功能:5分钟完整实用指南
  • 绝区零一条龙:3大核心功能让你每天节省2小时游戏时间
  • 10分钟搞定黑苹果配置:OpCore-Simplify让复杂OpenCore EFI创建变得简单
  • Excalidraw虚拟白板深度解析:从手绘风格到企业级协作的技术全景
  • 从命令行到交互终端:Joern实战绘制代码属性图全流程解析
  • 免费解锁WeMod专业版:终极指南与完整解决方案
  • 2026年新消息:探寻成都本地人常去的火锅推荐 - 品牌鉴赏官2026
  • LPC540xx系列微控制器外设深度解析:GPIO、通信接口与低功耗设计实践
  • 从Intel到ARM:CNN模型跨架构部署的性能瓶颈与优化实战
  • Python多版本测试自动化:使用Nox构建高效测试矩阵
  • PyEcharts 雷达图实战:从基础绘制到多维数据可视化
  • 2026达州2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • MC68HC908QF4时钟系统深度解析:从内部RC到外部晶振的实战配置与避坑指南
  • 从数据采集到可视化:Python实战个人历史行为数据分析
  • 2026绍兴漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 基于MATLAB与ThingSpeak构建数据驱动的个人任务分析系统