Framework 开发之 android.bp android.mk 与 make / soong之间的关系

0 阅读3分钟

一、概念梳理

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 语言编写,负责:

    1. 解析所有 Android.bp
    2. 处理模块依赖、版本、平台差异
    3. 自动翻译成 Ninja 构建文件
  • Ninja:高性能轻量编译后端,负责真正执行编译,并行编译速度远快于 GNU make。

3)Kati(中间桥接层,关键!)

Google 不能一下子抛弃海量旧项目的 Android.mk,于是做了 Kati

Kati = 一个把 Android.mk(make语法) 转换成 Ninja 文件的工具

二、完整编译流水线(Android 现代编译流程)

源码目录
    ├─ Android.bpSoong(Go) → Ninja文件
    └─ Android.mk → Kati      → Ninja文件
                ↘️
                     Ninja(真正执行gcc/clang/aapt/dex2oat...)

make 命令现在只是一个入口脚本make xxx → 调用 soong_ui(统一入口工具)

  1. soong_ui 启动 Soong 解析 .bp
  2. soong_ui 启动 Kati 解析旧的 .mk
  3. 全部输出为 out/build-*.ninja
  4. 调用 ninja 并行编译所有目标

一句话总结三者关系

  1. Android.mk:旧版模块描述文件(make 语法,可写 shell),由 Kati 翻译
  2. Android.bp:新版模块描述文件(纯 JSON 声明),由 Soong 翻译
  3. make:现在只是用户输入的入口命令;底层最终全部交给 Ninja 高速编译

表格

组件作用语言 / 格式
Android.mk旧模块编译配置Makefile 脚本
Android.bp新模块编译配置Blueprint(json-like)
Kati翻译 mk → ninjaC++/Go
Soong解析 bp,处理复杂逻辑 → ninjaGo
Ninja高性能真正编译执行引擎ninja 文件
make传统构建工具,现在只是兼容入口GNU Make

三、Android 系统编译整套是什么技术栈

1. 整体架构名称:Soong Build System(Android Build)

分层结构:

  1. 用户层命令make / m/mm/mmm / lunch

  2. 入口程序:soong_ui(Go)统一调度 Soong + Kati

  3. 配置描述层

    • 遗留:Android.mk
    • 现代:Android.bp + soong_config
  4. 翻译层

    • Kati:mk → ninja
    • Soong:bp → ninja,支持插件、架构变体、SDK 版本、vendor 分区分离
  5. 执行后端:Ninja(并行增量构建)

  6. 编译工具链

    • C/C++:Clang / GCC(Android 早已主推 Clang)
    • Java:javac /d8 /r8(编译 class → dex)
    • Resources:aapt2(编译资源 arsc)
    • Linker:lld
    • 后续打包工具:signapk、zipalign、img2simg、mkuserimg(生成 system/vendor 镜像)

2. 关键演进历史

  1. Android ~6 (Marshmallow) :纯 Make + Android.mk
  2. Android 7~8 (N/O)混合模式(Soong + Kati 共存) ,mk 和 bp 一起编译
  3. Android 9+ :逐步迁移到 Android.bp,Vendor 强制使用 bp(Treble / Project Treble)
  4. 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