文章目录
- 1. 基本概念
- 2. Android build system的变迁
- 2.1 Android N 前后build system的改变
- 2.1.1 `Android N`之前
- 2.1.2 `Android N`之后
- 2.2 Android 10与Android 4.4 build目录对比
- 2.3 Android10 manifest.xml中编译系统相关部分
- 3. envsetup.sh分析
- 4. kati、soong、blueprint、ninja
- 4.1 ninja
- 4.2 kati
- 4.3 soong
- 4.4 blueprint
- 4.5 kati、soong、blueprint、ninja之间的逻辑关系
1. 基本概念
build
(构建)和compile
(编译)不同,build包含compile。make
属于构建工具、gcc
属于编译工具。build system
通过构建工具和构建脚本控制编译工具对源码进行编译。
2. Android build system的变迁
2.1 Android N 前后build system的改变
2.1.1 Android N
之前
Android N
之前Android build system
通过Makefile
完成编译。主体逻辑由make
工具执行。
【重要】
m
ormake
命令等效于make -f build/core/main.mk
2.1.2 Android N
之后
Android N
之后Android build system
通过soong
+kati
+makefile
完成编译。主体逻辑由soong
来执行
【重要】
m
ormake
命令等效于out/soong_ui --make-mode
2.2 Android 10与Android 4.4 build目录对比
build
目录下原本的makefile
都移动到了build/make
目录下。见上图红色箭头指示部分
build
目录中常用的文件或者路径
通过软连接保留在原来的位置。见蓝色直线连接部分
新增了kati
、soong
、blueprint
目录
2.3 Android10 manifest.xml中编译系统相关部分
可以看到在manifest.xml设置了很多软连接,并copy /build/make/core/root.mk
到/Makefile
3. envsetup.sh分析
source envsetup.sh
是Android编译的第一步,为后面的编译做了铺垫。了解envsetup.sh
对应我们分析Android build system
很重要
我们回顾一下Android编译命令的执行顺序
source envsetup.sh
lunch <target_product>-<variant_version>
make update-api
make
lunch
、make
、m/mm/mm
、croot
等命令都是envsetup.sh
中定义的函数
关于envsetup.sh
的分析见笔记envsetup
文件夹
4. kati、soong、blueprint、ninja
4.1 ninja
ninja
是一种构建架构类似于make
,用构建编译系统。
Android开发者一般不会去手动编写ninja
文件,几乎无法找到Android源码中.ninja文件(测试部分除外)。
Android中使用Android.mk
或 Android.bp
去构建模块。
4.2 kati
kati 一个基于 Golang 和 C++ 的工具,用于将 Android.mk 转换为 .ninja 文件
4.3 soong
soong 一个基于 Golang 的工具,用于将 Android.bp 转换为 .ninja 文件
4.4 blueprint
blueprint 一个基于 Golang 的工具,是 soong 的一部分。blueprint 用于解析文件格式,soong 解析内容的具体含义
4.5 kati、soong、blueprint、ninja之间的逻辑关系
kati soong blueprint ninja之间的逻辑关系,按下面的流程来理解
makefile文件(包括复杂逻辑的.mk)
makefile(包括复杂逻辑的.mk文件) ---> kati ---> ninja ---> 编译
Android.mk文件(简单的Android.mk文件,即不包含逻辑控制语句)
Android.mk文件 ---> androidmk ---> *.bp
Android.bp文件(Android.bp文件本身不包含逻辑控制语句)
Android.bp ---> blueprint ---> .ninja ---> soong ---> ninja ---> 编译