一、概念梳理
1. 三个名词分别是什么
1)make / Makefile(旧时代核心)
- make:是 GNU 的构建工具,读取
Makefile文件执行编译命令。 - Android 早期整套构建系统基于
make,顶层是build/core/Makefile。 mmm / mm命令本质都是封装后的 make。Android.mk:就是 Android 自定义的 Makefile 片段,用来描述一个模块(APK、so、bin、jar)源码、依赖、编译参数。- 配套还有
Application.mk,用来配置 NDK 编译。
痛点:Android 模块越来越多,make 单线程分析、增量编译慢、依赖容易出错、Windows/Mac 跨平台差。
2)Soong(Android N 开始推出的新一代编译框架)
-
Soong 不是 make 的替代品,是「前端解析器」
-
配置文件不再是
Android.mk,而是Android.bp(Blueprint,JSON 风格纯声明式配置,没有 shell 脚本) -
Soong 用 Go 语言编写,负责:
- 解析所有
Android.bp - 处理模块依赖、版本、平台差异
- 自动翻译成 Ninja 构建文件
- 解析所有
-
Ninja:高性能轻量编译后端,负责真正执行编译,并行编译速度远快于 GNU make。
3)Kati(中间桥接层,关键!)
Google 不能一下子抛弃海量旧项目的 Android.mk,于是做了 Kati:
Kati = 一个把
Android.mk(make语法)转换成 Ninja 文件的工具
二、完整编译流水线(Android 现代编译流程)
源码目录
├─ Android.bp → Soong(Go) → Ninja文件
└─ Android.mk → Kati → Ninja文件
↘️
Ninja(真正执行gcc/clang/aapt/dex2oat...)
make 命令现在只是一个入口脚本: make xxx → 调用 soong_ui(统一入口工具)
- soong_ui 启动 Soong 解析
.bp - soong_ui 启动 Kati 解析旧的
.mk - 全部输出为
out/build-*.ninja - 调用 ninja 并行编译所有目标
一句话总结三者关系
- Android.mk:旧版模块描述文件(make 语法,可写 shell),由 Kati 翻译
- Android.bp:新版模块描述文件(纯 JSON 声明),由 Soong 翻译
- make:现在只是用户输入的入口命令;底层最终全部交给 Ninja 高速编译
表格
| 组件 | 作用 | 语言 / 格式 |
|---|---|---|
| Android.mk | 旧模块编译配置 | Makefile 脚本 |
| Android.bp | 新模块编译配置 | Blueprint(json-like) |
| Kati | 翻译 mk → ninja | C++/Go |
| Soong | 解析 bp,处理复杂逻辑 → ninja | Go |
| Ninja | 高性能真正编译执行引擎 | ninja 文件 |
| make | 传统构建工具,现在只是兼容入口 | GNU Make |
三、Android 系统编译整套是什么技术栈
1. 整体架构名称:Soong Build System(Android Build)
分层结构:
-
用户层命令:
make/m/mm/mmm/lunch -
入口程序:soong_ui(Go)统一调度 Soong + Kati
-
配置描述层
- 遗留:
Android.mk - 现代:
Android.bp+soong_config
- 遗留:
-
翻译层
- Kati:mk → ninja
- Soong:bp → ninja,支持插件、架构变体、SDK 版本、vendor 分区分离
-
执行后端:Ninja(并行增量构建)
-
编译工具链
- C/C++:Clang / GCC(Android 早已主推 Clang)
- Java:javac /d8 /r8(编译 class → dex)
- Resources:aapt2(编译资源 arsc)
- Linker:lld
- 后续打包工具:signapk、zipalign、img2simg、mkuserimg(生成 system/vendor 镜像)
2. 关键演进历史
- Android ~6 (Marshmallow) :纯 Make + Android.mk
- Android 7~8 (N/O) :混合模式(Soong + Kati 共存) ,mk 和 bp 一起编译
- Android 9+ :逐步迁移到 Android.bp,Vendor 强制使用 bp(Treble / Project Treble)
- Android 12+ :大量移除 Android.mk,优先 Soong,很多旧 mk 转为 bp
四、通俗比喻帮助理解
Android.mk= 老式手写菜谱(make 脚本,灵活但杂乱难维护)Android.bp= 标准化表单菜谱(Soong,只填属性,不能写脚本)- Kati = 翻译老菜谱成统一机器指令
- Soong = 处理新标准化菜谱
- Ninja = 很多厨师并行干活真正炒菜
make= 厨房门口的喊单入口
五、日常开发命令本质
source build/envsetup.sh
lunch aosp_arm64-eng
make -j32
执行过程: make → soong_ui → Soong + Kati 生成 ninja → ninja -j32 并发编译 → 生成 system.img、boot.img