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指令当前目录的智能编译mmMake 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我整理了几个常用模块的编译示例编译系统UImmm 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 增量编译的妙用开发过程中最耗时的往往不是编码而是等待编译。这时候mmaMake 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/camera3.3 常见错误排查No rule to make target错误 检查路径是否正确确保目标目录包含Android.mk。我常用这个命令快速定位find . -name Android.mk | grep camera头文件找不到问题 在Android.mk中添加LOCAL_C_INCLUDES $(TOP)/path/to/include产物未更新 尝试删除out目录下的中间文件rm -rf out/target/product/[设备名]/obj/SHARED_LIBRARIES/[模块名]_intermediates4. 典型模块编译实战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 reboot4.3 内核模块单独编译虽然m/mm/mmm主要用于Android部分但内核模块也可以单独编译cd kernel/msm-4.14 make -j16 modules_prepare make -j16 drivers/media/usb/uvc/uvcvideo.ko5. 环境配置与工具链5.1 自定义编译环境在~/.bashrc中添加这些alias能极大提升效率alias mmake -j16 alias mmmake -j16 modules alias mmmmake -j16 module-single5.2 编译缓存利用开启ccache可以缩短30%以上编译时间export USE_CCACHE1 ccache -M 50G # 设置缓存大小5.3 IDE集成技巧在Android Studio中配置外部工具打开Settings → Tools → External Tools添加新工具设置Program: /bin/bashArguments: -c source build/envsetup.sh mmm $ModulePath$在工程中右键即可快速编译当前模块经过半年多的实践验证这套编译方法使我的调试效率提升了近3倍。特别是在修改系统服务时原本需要1小时的完整编译现在用mmm只需2分钟。记住关键原则全系统改动用m目录内修改用mm精准定位用mmm。

相关新闻

FluentTerminal:为什么这款现代终端模拟器值得你尝试?

FluentTerminal:为什么这款现代终端模拟器值得你尝试?

FluentTerminal:为什么这款现代终端模拟器值得你尝试? 【免费下载链接】FluentTerminal A Terminal Emulator based on UWP and web technologies. 项目地址: https://gitcode.com/gh_mirrors/fl/FluentTerminal 你是否正在寻找一款功能强大、界面…

2026/6/20 3:03:01阅读更多 →
LPC540xx系列微控制器外设深度解析:GPIO、通信接口与低功耗设计实践

LPC540xx系列微控制器外设深度解析:GPIO、通信接口与低功耗设计实践

1. LPC540xx/LPC54S0xx GPIO:不仅仅是开关,更是系统效率的基石提到微控制器的GPIO,很多刚入行的朋友可能觉得这无非就是配置一下输入输出、读个电平、写个高低,没什么技术含量。但如果你在工业控制或者对实时性要求苛刻的物联网节…

2026/6/20 3:03:01阅读更多 →
深入解析MC68060处理器MMU与ATC:虚拟内存与缓存协同设计原理

深入解析MC68060处理器MMU与ATC:虚拟内存与缓存协同设计原理

1. 项目概述与核心价值在任何一个追求极致性能的处理器设计里,内存管理单元(MMU)都是那个在幕后默默扛下所有复杂工作的“无名英雄”。它负责将程序员眼中连续、规整的虚拟地址空间,映射到物理内存中可能支离破碎的真实页框上。这…

2026/6/20 2:58:01阅读更多 →
深入解析LPC2930时钟与电源管理:嵌入式系统低功耗设计核心

深入解析LPC2930时钟与电源管理:嵌入式系统低功耗设计核心

1. 项目概述:深入LPC2930的时钟与电源心脏在嵌入式系统开发,尤其是汽车电子、工业控制这类对实时性和功耗都极为敏感的领域,选对一颗MCU只是第一步,真正考验工程师功力的,是如何“驯服”它内部的时钟与电源体系。很多朋…

2026/6/20 4:08:05阅读更多 →
Playwright:新一代UI自动化测试框架的核心优势与实战指南

Playwright:新一代UI自动化测试框架的核心优势与实战指南

1. 项目概述:为什么说Playwright是“新一代最强”?如果你还在用Selenium或者Puppeteer做UI自动化测试,最近肯定被一个名字刷屏了——Playwright。这个由微软开源的项目,从2020年正式发布到现在,几乎是以火箭般的速度席…

2026/6/20 4:08:05阅读更多 →
Claude Opus 4.7深度解析:系统级多模态推理与合规内生化

Claude Opus 4.7深度解析:系统级多模态推理与合规内生化

1. 项目概述:这不是一次常规升级,而是一次能力边界的重新测绘“如何评价Anthropic最新发布的Claude Opus 4.7?”——这个标题背后,藏着的不是一句轻飘飘的“比上一代强一点”,而是整个AI行业在2024年中段遭遇的一次认知…

2026/6/20 4:08:05阅读更多 →
英雄联盟智能助手终极指南:如何用LeagueAkari提升游戏体验与胜率

英雄联盟智能助手终极指南:如何用LeagueAkari提升游戏体验与胜率

英雄联盟智能助手终极指南:如何用LeagueAkari提升游戏体验与胜率 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为英雄联盟中…

2026/6/20 4:08:05阅读更多 →
GLM-5.1深度解析:国产大模型的中文长文本结构化语义建模突破

GLM-5.1深度解析:国产大模型的中文长文本结构化语义建模突破

1. 项目概述:这不是又一个“开源模型发布”,而是国产大模型技术路线的一次关键转向最近刷到智谱官宣GLM-5.1的消息,朋友圈里不少同行第一反应是:“哦,又发新模型了?”——但我在实验室实测完第一批推理样本…

2026/6/20 4:08:05阅读更多 →
Pytest数据库交互测试实战:从Fixture设计到并发场景验证

Pytest数据库交互测试实战:从Fixture设计到并发场景验证

1. 项目概述:为什么需要关注pytest与数据库的交互测试?在自动化测试领域,尤其是接口、服务和数据层的测试中,与数据库的交互是一个绕不开的核心环节。很多测试同学在用pytest写用例时,常常会遇到这样的困境&#xff1a…

2026/6/20 4:03:05阅读更多 →
【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

【课程设计/毕业设计】基于 Web 的高校县志馆藏信息综合管理系统设计与实现 基于Django的青岛滨海学院特色文献捐赠流转管理系统的设计与实现【附源码、数据库、万字文档】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/6/20 0:02:40阅读更多 →
MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

MC68HC908RF2A定时器PWM生成原理与实战:无缓冲与缓冲模式详解

1. 项目概述与核心价值在嵌入式开发,尤其是电机驱动、LED调光、开关电源这些需要精确控制“能量”的领域,脉冲宽度调制(PWM)技术是工程师手中的一把瑞士军刀。它的本质很简单:用一个固定频率的方波,通过改变…

2026/6/20 0:02:40阅读更多 →
在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

在银河麒麟V10桌面(2205版本)上实战部署软RAID 1:从模块黑名单到自动挂载

1. 银河麒麟V10桌面系统与软RAID 1基础认知 第一次在银河麒麟V10桌面上折腾软RAID 1时,我踩了不少坑。这个国产操作系统基于Linux内核,但2205版本对软RAID模块做了特殊处理,需要额外操作才能正常使用。软RAID 1其实就是磁盘镜像技术&#xff…

2026/6/20 0:02:40阅读更多 →