一、常在手机驱动开发过程中,一般都会碰到bp,mk,makefile,soong,buleprint,Ninja等相互作用,它们本身的作用以及相互之间的关系是什么样子呢?
Android.bp文件:它是编译的配置文件,功能主要是用来配置编译一个一个的模块,因为现在编译的体系很大,不可能就是平常所写的几百行几千行的代码,写一个makefile就可以通过编译命令直接进行编译生成需要的静态库,动态库等目标文件。
bp文件的样子:
cc_binary{ //模块类型
name: "caluate", //名字属性,此处name必须有
srcs: ["src/hanxp/cal.c"], //原代码属性
shared_libs: [“libcal”], //动态库属性
......
}
bp它的来源?
此处就需要介绍第二个文件,Android.mk文件:由于上面说的最初的时候基本代码量比较少,即可通过简单的makefile去组织编译规则,通过make即可实现编译,因为现在的人都喜欢把所有的东西进行配置,实现统一&沿用的形式,因此就把make的编译方法进行配置,即Android.mk(这里说的Android.mk和我们常见的linux下面的makefile它的作用是一样的,只不过我们现在说的是手机android系统下的编译,但是两者的语法编写规则都是有区别的,这个一定要注意。具体细节可以参考(android.mk和makefile的区别和关系):https://blog.csdn.net/gjq_1988/article/details/12573721 这个链接。)在android7.0以前,大家都基本使用的Android.mk去组织配置编译的规则等,直接用make加对应的参数即可实现编译,但是慢慢的由于功能越多,需求越多,代码越庞大,直接导致编译时间过长,此时从7.0之后,Android.bp,此时的bp文件就是替代之前的mk,同时引入了ninja编译代码,这里的ninja就相当于make编译代码,bp文件是怎么去编译呢?此时又出现了blueprint和soong两个编译工具,blueprint用来解析bp文件的形式,soong解析它的内容,即可实现。但在一般的安卓代码中基本会看到里面依旧存在着bp、mk一起用,这些由于原有的部分代码依旧沿用的之前的mk的编译方法,为了能沿用之前的编译方法,因此就引入了Kati工具,它可以直接把mk文件转换生成ninja文件进行编译,并且同时还有一种方法可以实现Anroid.mk到Android.bp文件的转换,即出现androidmk工具。
总结:
文件:
Android.bp:用来替换之前使用的Android.mk。
Android.mk:之前使用的编译配置文件。
工具:
androidmk:实现Android.mk转换成Android.bp文件。
blueprint:解析Android.bp的形式。
soong:解析Android.bp的内容。
最终生成的编译文件:
Ninja
简单理解:
make和Ninja的关系,之前makefile写完后,直接make+参数进行编译,现在上面的流程走完后生成Ninja文件,直接使用ninja+参数进行编译。