文章目录

  • 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. 基本概念

mtk androidS编译kernel android编译系统_Android

  • 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工具执行。

【重要】

mormake命令等效于make -f build/core/main.mk

2.1.2 Android N之后

Android N之后Android build system通过soong+kati+makefile完成编译。主体逻辑由soong来执行

【重要】

mormake命令等效于out/soong_ui --make-mode

2.2 Android 10与Android 4.4 build目录对比

mtk androidS编译kernel android编译系统_Android_02

build目录下原本的makefile都移动到了build/make目录下。见上图红色箭头指示部分

build目录中常用的文件或者路径通过软连接保留在原来的位置。见蓝色直线连接部分

新增了katisoongblueprint目录

2.3 Android10 manifest.xml中编译系统相关部分

可以看到在manifest.xml设置了很多软连接,并copy /build/make/core/root.mk/Makefile

mtk androidS编译kernel android编译系统_android_03

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

lunchmakem/mm/mmcroot等命令都是envsetup.sh中定义的函数

关于envsetup.sh的分析见笔记envsetup文件夹

4. kati、soong、blueprint、ninja

4.1 ninja

ninja是一种构建架构类似于make,用构建编译系统。

Android开发者一般不会去手动编写ninja文件,几乎无法找到Android源码中.ninja文件(测试部分除外)。

Android中使用Android.mkAndroid.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 ---> 编译

mtk androidS编译kernel android编译系统_Android_04