Android 8.0编译系统简述
Posted Welljia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 8.0编译系统简述相关的知识,希望对你有一定的参考价值。
android 8.0编译系统简述
概述
Android 7.0之前,android编译主要依赖makefile,随着android工程越来越大,makefile编译花费时间也越来越多,所以7.0开始逐步引入了kati soong(可选,用的话需要在执行编译时将USE_SOONG=true开启),soong会将Android.bp(用于替换Android.mk文件)文件转化为ninja文件,然后由ninja去对系统进行管理。到了8.0,android 默认启用Soong,不需要配置USE_SOONG了。
kati
kati是一个基于Makefile来生成ninja.build的小项目。 主要用于把Makefiel转成成ninja file,自身没有编译能力,转换后使用Ninja编译。
在编译过程中,kati负责把既有的Makefile、Android.mk文件,转换成Ninja文件。 在Android 7.0中,它独挑大梁。 在Android 8.0以后,它与Soong一起,成为Ninja文件的两大来源。 Kati更像是Google过渡使用的一个工具,等所有Android.mk都被替换成Android.bp之后,相信Soong工具会被打开使用来替换Kati.
在单独使用时,它对普通的小项目还能勉强生效。 面对复杂的、多嵌套的Makefile时,它往往无法支持,会出现各种各样的问题。 当然,也可以理解为,它只为Android而设计。
总之,不推荐在Android以外的任何项目中使用kati。
Soong
soong是由Go语言写的一个项目,从Android 7.0开始,在prebuilts/go/目录下新增了Go语言所需的运行环境,Soong在编译时使用,解析Android.bp,将之转化为Ninja文件,完成Android的选择编译,解析配置工作等。故Soong相当于Makefile编译系统的核心,即build/make/core下面的内容。
另外Soong还会编译产生一个androidmk命令,可以用来手动将Android.mk转换成Android.bp文件。不过这只对无选择、循环等复杂流程控制的Android.mk生效。
Android.bp
Android.bp是用来替换Android.mk的,用类似JSON的声明来描述需要构建的模块,使用Blueprint框架来解析,最终转换成ninja,与Android.mk相比设计非常简洁,没有分支、循环等流程控制,android的选择编译、解析配置等需求,就交给了Soong去完成。
Blueprint
Blueprint也是由Go语言写的,是Soong的一部分,负责解析Android.bp,主要是解析文件的形式,内容还是交由soong去解释。
在Android编译最开始的准备阶段,会执行build/soong/soong.bash进行环境准备。 其中会先编译、安装Blueprint到out目录下。 也就是说,在编译Android项目时,Android.bp相关工具链会自动编译,无需费神。
Soong是与Android强关联的一个项目,而Blueprint则相对比较独立,可以单独编译、使用。
Ninja
Ninja是一个致力于速度的小型编译系统(类似于Make),如果把其他编译系统比做高级语言的话,Ninja就是汇编语言。通常使用Kati或soong把makefile转换成Ninja files,然后用Ninja编译。
主要有两个特点:
- 可以通过其他高级的编译系统生成其输入文件;
- 它的设计就是为了更快的编译;
ninja核心是由C/C++编写的,同时有一部分辅助功能由python和shell实现。由于其开源性,所以可以利用ninja的开源代码进行各种个性化的编译定制。
各工具之间的关系
Android.mk文件、Android.bp、kati、Soong、Blueprint、Ninja之间的关系如下:
Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja
(Android.mk --> Soong --> Blueprint --> Android.bp)
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义。
Android.mk可以通过Soong提供的androidmk转换成Android.bp,但仅限简单配置。 目前Oreo的编译流程中,仍然是使用kati来做的转换。
现存的Android.mk文件、既有的Android.bp,都会分别被转换成Ninja。 从Android.mk与其它Makefile,会生成out/build-<product_name>.ninja文件。 而从Android.bp,则会生成out/soong/build.ninja。 此外,还会生成一个较小的out/combined-<product_name>.ninja文件,负责把二者组合起来,作为执行入口。
最终,Ninja文件才是真正直接控制源码编译的工具。
以上是关于Android 8.0编译系统简述的主要内容,如果未能解决你的问题,请参考以下文章